简短的回答:不,不应该同时运行。
Conda 处理事务安全的大部分方式都是在 v4.3 版本中建立的。 The release notes in v4.3.0 关于对锁的更改明确评论运行多个进程:
[U] 用户请注意,当 conda 在多个进程中运行并在相同的包缓存和/或环境中运行时,可能会导致未定义的行为。
听起来您在谈论不同的环境,所以这应该不是问题。但是需要确保要安装的包已经下载到包缓存中,否则不安全。
部分并行策略
有一个--download-only 标志,它只会将包添加到包缓存中(即不能同时完成的部分)。但问题是这仍然需要在每个 env 的基础上完成,因为不同的 env 可能有不同的约束(例如,不同的 Python 版本),需要不同的包构建。
我认为你可以在 CLI 上做的最好的事情是
- 在每个 env 上依次运行
conda install --download-only pkg,然后
- 为环境并行运行
conda install pkg。
但是,这不在任何官方建议中,并且 Conda 进行交易的方式发生变化可能会导致这不安全。我还要说,我非常怀疑这会为您节省很多时间;事实上,它可能需要更长的时间。这种方法将涉及每个 env 必须两次解决和准备事务,这通常是计算量最大的步骤。您最终并行化的部分涉及磁盘事务,这将是 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 交易的列表。前者涉及操作包缓存,而后者仅涉及环境。如果我然后运行
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 交易是安全的,那么这是安全的。