conda 安装是线程安全操作吗?



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

简短的回答:不,它不应该同时运行

Conda 处理交易安全的大部分方式都是在 v4.3 版本中建立的。v4.3.0 中关于锁更改的发行说明明确注释了运行多个进程:

请注意,当 conda 在多个进程中运行并在相同的包缓存和/或环境中运行时,可能会导致未定义的行为。

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

部分并行策略

有一个--download-only标志,它只会将包添加到包缓存中(即不能同时完成的部分(。但问题是,这仍然需要在每个环境的基础上完成,因为不同的环境可能有不同的约束(例如,不同的 Python 版本(,需要不同的包构建。

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

  1. 在每个 env 上按顺序运行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

我现在只看到链接交易。 值得注意的是,现在-n bar也是如此,这应该强化步骤 1 应按顺序完成的事实。好的部分是它不会导致重新下载相同的软件包;不好的部分,它涉及每个环境中发生的解决方案。在更异构的环境中,我们可以预期每个环境中可能会有不同的 FETCH 操作。

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

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

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

最新更新