私たちのDjangoプロジェクトは巨大になっています。私たちは何百ものアプリを持っており、たくさんのサードパーティのpythonパッケージを使用しており、その多くはCをコンパイルする必要があります。私たちのメジャーリリース用の新しい仮想環境を作成する必要がある場合、デプロイには長い時間がかかります。そうは言っても、Pipから始めて、処理を高速化することを目指しています。パッケージを並行してインストールするPipのフォークを知っている人はいますか。 ?
これまでに行った手順:
私はこれをほとんど成功せずに行うプロジェクトを探しました。私はこのGithubGistを見つけました: https://Gist.github.com/197172 しかし、結果は私たちのシングルスレッドの友人とほとんど同じです。
次に、GithubでPipプロジェクトを見つけ、フォークのネットワークを調べて、自分がやろうとしていることを実行することに言及しているコミットを見つけることができるかどうかを確認し始めました。そこはめちゃくちゃです。私はそれをフォークし、必要に応じて自分で並列化しようとします。それを行うのに時間を費やすことは避けたいだけです。
Ep.ioのDjangoCon2011で、デプロイに関する説明を見て、CをコンパイルしてPypiをミラーリングする代わりに、pipの並列化、.soファイルの出荷について言及しましたが、その方法や使用方法については触れていませんでした。
展開プロセスを分析して、時間が実際にどこに行くのかを確認しましたか?複数の並列pipプロセスを実行しても、それほど高速化されないことに驚いています。
PyPIのクエリとパッケージの検索に時間がかかる場合(特にGithubやその他のソースからダウンロードする場合)、独自のPyPIを設定すると便利な場合があります。自分でPyPIをホストし、requirements.txt
ファイルに以下を追加できます( docs ):
--extra-index-url YOUR_URL_HERE
または、公式のPyPIを完全に置き換える場合は、次のようにします。
--index-url YOUR_URL_HERE
これにより、すべてのパッケージが近くのマシンで見つかるため、ダウンロード時間が短縮される可能性があります。
PILなどのCコードを使用してパッケージをコンパイルすることにも多くの時間がかかります。これがボトルネックであることが判明した場合は、複数のプロセスでコードをコンパイルすることを検討する価値があります。コンパイルされたバイナリをマシン間で共有できる場合もあります(ただし、オペレーティングシステム、CPUワード長など、多くのものが類似している必要があります)。
この例では、 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がまったく同時に同じ依存関係をインストールしようとすると、このメソッドの速度がパッケージマニフェストを混乱させる可能性がほとんどありません(ディストリビューションによって異なります)が、4つだけを実行している場合はほとんどありません時間。 pip install --uninstall depname
で簡単に修正できます。
Jamieson Beckerの回答に基づいて、次のコードはPipの並列ダウンロードを実行し、パッケージをすばやくインストールします。
まず、パッケージを配布( "dist")ディレクトリに並行してダウンロードします。これは、競合することなく簡単に並行して実行できます。印刷される各パッケージ名は、ダウンロード前に印刷されるため、デバッグに役立ちます。さらにヘルプが必要な場合は、-P9
を-P1
に変更して、順番にダウンロードしてください。
ダウンロード後、次のコマンドはPipにパッケージをインストール/更新するように指示します。ファイルはダウンロードされず、高速ローカルディレクトリからフェッチされます。
現在のバージョンのPip1.7、およびPip1.5と互換性があります。
パッケージのサブセットのみをインストールするには、「catrequirements.txt」ステートメントをカスタムコマンドに置き換えます。 'egrep -v githubrequirement.txt'
cat requirements.txt | xargs -t -n1 -P9 pip install -q --download ./dist
pip install --no-index --find-links=./dist -r ./requirements.txt
ビルドシステム(Jenkinsなど)ですべてをビルドして、ビルド固有の仮想環境ディレクトリにインストールする場合に役立ちますか?ビルドが成功したら、仮想環境を再配置可能にし、tarballを実行して、結果のタブラルを「released-tarballs」ストレージにプッシュします。デプロイ時に、最新のtarballを取得し、宛先ホストで解凍する必要があります。そうすれば、実行できるようになります。したがって、tarballをダウンロードするのに2秒、宛先ホストで解凍するのに0.5秒かかる場合、デプロイメントには2.5秒かかります。
このアプローチの利点は、すべてのパッケージのインストールが展開時ではなくビルド時に行われることです。
警告:仮想環境にビルド/コンパイル/インストールするビルドシステムワーカーは、ターゲットハードウェアと同じアーキテクチャを使用する必要があります。また、本番ボックスプロビジョニングシステムは、一部のPythonパッケージに含まれる可能性のあるさまざまなCライブラリの依存関係を処理する必要があります(たとえば、PIL
ではその前にlibjpeg
をインストールする必要があります) JPEG関連のコードをコンパイルできます。また、libjpeg
がターゲットボックスにインストールされていない場合は問題が発生します)
それは私たちにとってうまくいきます。
仮想環境を再配置可能にする:
virtualenv --relocatable /build/output/dir/build-1123423
この例ではbuild-1123423
はビルド固有の仮想envディレクトリです。
他のすべての回答は、 pipenvの使用を支持して非推奨と見なすことができます。
通常のpip
インストールの最大の制約は、依存関係グラフがないことです。 pipenv
を使用すると、依存関係グラフ全体を作成することでこれが解決されるため、競合しないすべての依存関係を問題なく並行してインストールできます。
基本的な使用法はpipに似ています:
pipenv install package packages
要件ファイルからの移行は、次のように簡単です。
pipenv install -r requirements.txt
インストール中に、pipenv
は依存関係グラフを生成し、手動でインストールされた依存関係をPiplock
ファイルに保存し、依存関係グラフ全体をPipfile.lock
に保存します。これらがリポジトリに追加されると、他の開発者は次のコマンドを実行するだけで作業を再開できます。
pipenv install