30

私たちの Django プロジェクトは巨大化しています。何百ものアプリがあり、大量のサードパーティの Python パッケージを使用しており、その多くは C でコンパイルする必要があります。メジャー リリース用に新しい仮想環境を作成する必要がある場合、デプロイに時間がかかります。そうは言っても、Pipから始めて、物事をスピードアップしようとしています。パッケージを並行してインストールする Pip のフォークを知っている人はいますか?

これまでに行った手順:

  • 私はこれを行うプロジェクトを探しましたが、ほとんど成功していません。この Github Gist を見つけました: https://gist.github.com/1971720しかし、結果はシングル スレッドの友人とほぼ同じです。

  • 次に、Github で Pip プロジェクトを見つけ、フォークのネットワークを調べて、自分がやろうとしていることに言及しているコミットを見つけられるかどうかを調べ始めました。そこはめちゃくちゃです。私はそれをフォークして、必要に応じて自分で並列化しようとしますが、それに時間を費やすのは避けたいだけです。

  • DjangoCon 2011 での ep.io の講演で、デプロイに関する説明があり、pip の並列化、C のコンパイルと Pypi のミラーリングの代わりに .so ファイルの配布について言及されていましたが、どのように行ったか、何を使用したかについては触れられていませんでした。

4

7 に答える 7

11

並列パイプの取り付け

この例では、 xargsを使用して、ビルド プロセスを約 4 倍並列化しています。以下の max-procs を使用して並列化係数を増やすことができます (コア数とほぼ同じにしてください)。

たとえば、何度も実行しているイメージングプロセスを高速化しようとしている場合は、毎回これを行うよりも、結果を直接イメージングするか、pipを使用してイメージを構築する方が簡単で、帯域幅の消費を確実に削減できます。 -tまたはvirtualenv

一度に 4 つのパッケージを並行してダウンロードしてインストールします。

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

注: xargs には、Linux ディストリビューションごとに異なるパラメーター名があります。詳細については、ディストリビューションのマニュアル ページを確認してください。

ヒアドキュメントを使用してインライン化された同じもの:

 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 がまったく同時に同じ依存関係をインストールしようとすると、このメソッドの速度がパッケージ マニフェストを混乱させる可能性がわずかにあります (ディストリビューションによって異なります)。時間。によってかなり簡単に修正できますpip install --uninstall depname

于 2015-04-14T02:44:14.803 に答える
9

展開プロセスを分析して、時間が実際にどこに費やされているかを確認しましたか? 複数の並列 pip プロセスを実行してもあまり高速化されないことに驚きました。

PyPI をクエリしてパッケージを見つけるのに時間がかかる場合 (特に、Github や他のソースからもダウンロードする場合)、独自の PyPI をセットアップすると便利な場合があります。PyPI を自分でホストし、requirements.txtファイル ( docs )に次を追加できます。

--extra-index-url YOUR_URL_HERE

または、公式の PyPI を完全に置き換えたい場合は、次のようにします。

--index-url YOUR_URL_HERE

これにより、すべてのパッケージが近くのマシンで見つかるようになるため、ダウンロード時間が短縮される場合があります。

PIL などの C コードを含むパッケージのコンパイルにも多くの時間が費やされます。これがボトルネックであることが判明した場合は、複数のプロセスでコードをコンパイルすることを検討する価値があります。コンパイルされたバイナリをマシン間で共有することもできます (ただし、オペレーティング システム、CPU ワード長など、多くのものが類似している必要があります)。

于 2012-06-13T18:43:37.693 に答える
-4

Jamieson Becker の回答に触発されて、インストール スクリプトを修正して、並列 pip インストールを実行したところ、改善されたようです。私の 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

少なくとも手動で問題を探すことができます。

于 2015-05-24T20:02:35.973 に答える