康达是否安装了线程安全操作?

时间:2019-10-02 22:58:24

标签: python conda

我想将软件包安装到多个conda环境中。一个接一个地执行此操作会花费一些时间,因此,如果我可以为每个环境并行运行所有conda install步骤,那将是很好的。尝试并行运行conda时,这是否可能或存在冲突(可能与硬链接和锁定文件有关)?

1 个答案:

答案 0 :(得分:1)

简短答案:否,它不能同时运行

大多数Conda处理交易安全的方式都建立在v4.3版中。 The release notes in v4.3.0关于锁的更改,对运行多个进程进行了明确注释:

  

[提醒用户,当conda在多个进程中运行并在相同的程序包缓存和/或环境中运行时,可能导致未定义的行为。

听起来您在谈论不同的环境,所以这不应该成为问题。但是,您需要确保要安装的软件包已下载到软件包缓存中,否则不安全。

部分并行策略

有一个--download-only标志,该标志只会将包添加到包缓存中(即无法同时完成的部分)。但是问题在于,仍然需要在每个环境中完成此操作,因为不同的环境可能具有不同的约束(例如,不同的Python版本),并需要不同的程序包构建。

我认为您在CLI上能做的最好的是

  1. 在每个环境中依次运行conda install --download-only pkg,然后
  2. 为环境并行运行conda install pkg

但是,这在任何官方建议中都不是,并且Conda进行交易方式的变化可能导致这种情况不安全。我还要说,我非常怀疑这会为您节省很多时间。实际上,这可能需要更长的时间。这种方法将涉及到每个环境都要解决和准备两次事务的环境,这通常是计算量最大的步骤。最终并行化的部分涉及磁盘事务,该事务将受I / O约束,因此我怀疑是否会节省任何时间。

一些证据证明这种安全性

虽然这不能肯定地证明其安全性,但是我们可以显式检查事务以确保当我们执行上述步骤2时,它仅涉及LINK事务。

为了对此进行测试,我做了两个环境:

conda create -n foo -y python=3.6
conda create -n bar -y python=3.6

然后我检查输出

conda install -n foo -d --json pandas

显示了FETCH和LINK事务的列表。前者涉及操纵程序包缓存,而后者仅涉及env。如果我再运行

conda install -n foo --download-only pandas

然后再次检查,

conda install -n foo -d --json pandas

我现在仅看到LINK交易。值得注意的是,-n bar现在也是如此,这应该加强了步骤1应该顺序执行的事实。好的方面是,它不会导致重新下载相同的程序包。不好的部分是,它涉及到每个环境中都存在的解决方案。在更加异构的环境中,我们可以预期每个环境中可能会有不同的FETCH操作。

最后,我可以运行并行最终安装

conda install -n foo -y pandas & conda install -n bar -y pandas &

如果我们可以假设不同环境中的LINK交易是安全的,那么这是安全的。

相关问题