conda install 是线程安全操作吗?

Red*_*son 5 python conda

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

mer*_*erv 5

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

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

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

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

部分并行策略

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

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

  1. conda install --download-only pkg在每个 env 上依次运行,然后
  2. conda install pkg为 envs 并行运行。

然而,这不在任何官方建议中,并且 Conda 交易方式的变化可能导致这不安全。我还要说,我非常怀疑这会为您节省多少时间;事实上,可能需要更长的时间。这种方法将涉及每个 env 必须解决和准备事务两次,这通常是计算量最大的步骤。您最终并行化的部分涉及磁盘事务,这将是 I/O 绑定的,所以我有点怀疑是否会节省任何时间。

一些证据表明这是安全的

虽然这并不能肯定地证明它的安全性,但我们可以明确检查事务以确保当我们运行上面的第 2 步时,它只会涉及 LINK 事务。

为了测试这一点,我做了两个环境:

conda create -n foo -y python=3.6
conda create -n bar -y python=3.6
Run Code Online (Sandbox Code Playgroud)

然后我检查输出

conda install -n foo -d --json pandas
Run Code Online (Sandbox Code Playgroud)

它显示了 FETCH 和 LINK 事务的列表。前者涉及操作包缓存,而后者仅涉及 env。如果我然后跑

conda install -n foo --download-only pandas
Run Code Online (Sandbox Code Playgroud)

并再次检查,

conda install -n foo -d --json pandas
Run Code Online (Sandbox Code Playgroud)

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

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

conda install -n foo -y pandas & conda install -n bar -y pandas &
Run Code Online (Sandbox Code Playgroud)

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

  • 如果有人对 conda 中的当前状态感兴趣,看起来[此问题](https://github.com/conda/conda/issues/6742)中对此进行了跟踪。交叉引用的问题也提供了大量相关讨论。 (3认同)