皮普平行安装(Parallel Pip install)

2019-06-25 11:14发布

我们的Django项目越来越庞大。 我们有数百个应用程序,并使用一吨第三方Python包,其中有许多需要具有C编译的。 我们的部署正在很长一段时间,当我们需要创建一个主要版本新的虚拟环境。 随着中说,我期待加快速度,从皮普。 有谁知道皮普的一个分支,将在并行安装包?

到此为止我已经采取了:

  • 我寻找那些只是做这个收效甚微的一个项目。 我也觉得这Github的要点是: https://gist.github.com/1971720但结果几乎完全一样我们单线程的朋友。

  • 后来我发现在Github上的点数项目,并开始寻找通过叉在网络上看到,如果我能找到提到做什么,我试图做任何承诺。 这是一个烂摊子在那里。 我将叉它,并尝试对其进行并行化自己,如果我必须这样做,我只是想避免花费时间这样做。

  • 我看到在2011 DjangoCon谈话从ep.io解释其部署的东西,他们提到并行点子,航运的.so文件,而不是编译C和镜像PyPI中,但他们并没有对他们怎么做或什么,他们用碰。

Answer 1:

你已经分析了部署过程,看看那里的时候真的不用? 我很惊讶运行多个并行PIP过程不加快步伐了。

如果时间去查询的PyPI并找到包(特别是当你还从GitHub和其他来源下载),那么它可能是有益的建立自己的PyPI。 您可以自己主持的PyPI并添加以下到您的requirements.txt文件( 文档 ):

--extra-index-url YOUR_URL_HERE

或者,如果你想完全取代正式的PyPI如下:

--index-url YOUR_URL_HERE

这可以加快下载速度,因为所有的包,现在附近的机器上找到。

很多的时候也进入与C语言代码,如PIL编译软件包。 如果事实证明这是瓶颈则是值得研究的多个进程中编译代码。 你甚至可以为您的机器之间共享编译的二进制文件(但很多事情需要是相似的,如操作系统,CPU字长,等等)



Answer 2:

在贾米森贝克尔的答案的基础上,将下面的代码做平行皮普下载,然后迅速安装软件包。

首先,我们并行下载包导入到分布(“DIST”)目录。 这是很容易并行,不会有冲突运行。 打印出的每个包名的下载,这与调试帮助之前打印出来。 对于额外的帮助,改变-P9-P1 ,依次下载。

下载完成后,下一个命令告诉画中画安装/升级包。 文件不能下载,它们是从快速本地目录牵强。

这是与当前版本的1.7匹的,也与皮普1.5兼容。

只安装包的子集,与您的自定义命令替换“猫requirements.txt”语句,如“egrep的-v github上requirement.txt”

cat requirements.txt | xargs -t -n1 -P9 pip install -q --download ./dist

pip install --no-index --find-links=./dist -r ./requirements.txt


Answer 3:

并行安装点子

这个例子使用xargs的约4倍并行构建过程。 你可以增加下面MAX-特效(保持约等于您的核数)的并行化的因素。

如果你想如加速,你正在做一遍又一遍的成像过程中,它可能会直接对结果更容易和肯定更低的带宽消耗,只是图像,而不是做每一次,或使用制作图片PIP -t或virtualenv中 。

下载并一次安装并行,四个包:

xargs --max-args=1 --max-procs=4 sudo pip install < requires.txt

注:xargs的具有不同Linux发行版本不同的参数名。 检查你的发行版的手册页的细节。

使用同样的事情联这里-DOC:

 cat << EOF | xargs --max-args=1 --max-procs=4 sudo pip install
 awscli
 bottle
 paste
 boto                                                                         
 wheel
 twine                                                                        
 markdown
 python-slugify
 python-bcrypt
 arrow
 redis
 psutil
 requests
 requests-aws
 EOF

警告:有一种遥远的可能性,这种方法的速度可能会混淆软件包清单(取决于你的发行版)如果多个PIP的安装尝试在完全相同的时间相同的依赖,但它是非常不可能的,如果你只是在做4日的时间。 它可以被很容易地被固定pip install --uninstall depname



Answer 4:

它会帮助,如果你有你的编译系统(如詹金斯)建立,一切都安装到特定生成的虚拟环境目录? 当构建成功,可以使虚拟环境重定位,压缩包,并产生的tablall推到你的“发布-tar包”存储。 在部署时,您需要获取最新的压缩包,解压缩后在目标主机上,然后它应该是准备执行。 因此,如果需要2秒钟就下载压缩包和0.5秒解压目标主机上,您的部署将需要2.5秒。

这种方法的优点是所有安装包发生在编译的时候,而不是在部署时间。

警告:您的构建系统工作者是构建/编译/安装的东西变成一个虚拟的env必须使用相同的架构目标硬件。 此外,您的生产彩盒供应系统将需要照顾的各种C库的依赖关系,一些Python包可能(如PIL要求libjpeg安装之前可以编译JPEG相关的代码,也事将打破,如果libjpeg目标未安装框)

它的工作原理很适合我们。

制作一个虚拟ENV重定位:

virtualenv --relocatable /build/output/dir/build-1123423

在这个例子中build-1123423是特定生成的虚拟ENV目录。



Answer 5:

所有其他的答案可以考虑弃用,取而代之的使用pipenv

一个普通的最大约束pip安装是缺乏依赖关系图。 随着pipenv这是通过建立一个完整的依赖关系图,因此所有非冲突的依赖性可以安装在平行的,没有任何问题的解决。

基本用法类似于PIP:

pipenv install package packages

从需求文件迁移一样简单:

pipenv install -r requirements.txt

在安装过程中pipenv将生成的依赖图和存储在所述手动安装的依赖关系Piplock文件和整个依赖图将存储在Pipfile.lock 。 一旦这些被添加到存储库中其他开发者可以简单地通过运行恢复工作:

pipenv install


Answer 6:

灵感来自贾米森贝克尔的回答 ,我修改安装脚本做平行点子安装和它看起来像和改进。 我的bash脚本现在包含这样一个片段:

requirements=''\
'numpy '\
'scipy '\
'Pillow '\
'feedgenerator '\
'jinja2 '\
'docutils '\
'argparse '\
'pygments '\
'Typogrify '\
'Markdown '\
'jsonschema '\
'pyzmq '\
'terminado '\
'pandas '\
'spyder '\
'matplotlib '\
'statlab '\
'ipython[all]>=3 '\
'ipdb '\
''tornado>=4' '\
'simplepam '\
'sqlalchemy '\
'requests '\
'Flask '\
'autopep8 '\
'python-dateutil '\
'pylibmc '\
'newrelic '\
'markdown '\
'elasticsearch '\
"'"'docker-py==1.1.0'"'"' '\
"'"'pycurl==7.19.5'"'"' '\
"'"'futures==2.2.0'"'"' '\
"'"'pytz==2014.7'"'"' '

echo requirements=${requirements}
for i in ${requirements}; do ( pip install $i > /tmp/$i.out 2>&1 & ); done

我至少可以手动查找问题。



文章来源: Parallel Pip install