我想将软件包安装到多个conda环境中。一个接一个地执行此操作会花费一些时间,因此,如果我可以为每个环境并行运行所有conda install
步骤,那将是很好的。尝试并行运行conda时,这是否可能或存在冲突(可能与硬链接和锁定文件有关)?
答案 0 :(得分:1)
简短答案:否,它不能同时运行。
大多数Conda处理交易安全的方式都建立在v4.3版中。 The release notes in v4.3.0关于锁的更改,对运行多个进程进行了明确注释:
[提醒用户,当conda在多个进程中运行并在相同的程序包缓存和/或环境中运行时,可能导致未定义的行为。
听起来您在谈论不同的环境,所以这不应该成为问题。但是,您需要确保要安装的软件包已下载到软件包缓存中,否则不安全。
有一个--download-only
标志,该标志只会将包添加到包缓存中(即无法同时完成的部分)。但是问题在于,仍然需要在每个环境中完成此操作,因为不同的环境可能具有不同的约束(例如,不同的Python版本),并需要不同的程序包构建。
我认为您在CLI上能做的最好的是
conda install --download-only pkg
,然后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交易是安全的,那么这是安全的。