Eventletとの並行性—Pythonドキュメント

提供:Dev Guides
Celery/docs/latest/userguide/concurrency/eventlet
移動先:案内検索

Eventletとの並行性

序章

Eventlet ホームページでは、Pythonの並行ネットワークライブラリとして説明されており、コードの記述方法ではなく、コードの実行方法を変更できます。

  • epoll(4)または libevent を使用して、高度にスケーラブルなノンブロッキングI / O を実現します。
  • コルーチンは、開発者がスレッド化に似たプログラミングのブロッキングスタイルを使用することを保証しますが、非ブロッキングI / Oの利点を提供します。
  • イベントディスパッチは暗黙的です。つまり、Pythonインタープリターから、またはより大きなアプリケーションの小さな部分として、Eventletを簡単に使用できます。


Celeryは、代替の実行プール実装としてEventletをサポートし、場合によってはpreforkよりも優れています。 ただし、1つのタスクがイベントループを長時間ブロックしないようにする必要があります。 一般に、CPUバウンド操作はEventletではうまくいきません。 また、通常C拡張機能を備えた一部のライブラリは、モンキーパッチを適用できないため、Eventletを使用してもメリットが得られないことに注意してください。 よくわからない場合は、ドキュメントを参照してください。 たとえば、pylibmcはEventletとの連携を許可しませんが、psycopg2は両方がC拡張子を持つライブラリである場合に連携を許可します。

プリフォークプールは複数のプロセスを使用できますが、多くの場合、CPUごとに数プロセスに制限されます。 Eventletを使用すると、数百または数千のグリーンスレッドを効率的に生成できます。 フィードハブシステムを使用した非公式のテストでは、イベントレットプールは毎秒数百のフィードをフェッチして処理できましたが、プリフォークプールは100のフィードを処理するのに14秒を費やしました。 これは、非同期I / Oが特に得意なアプリケーションの1つであることに注意してください(非同期HTTP要求)。 Eventletワーカーとpreforkワーカーの両方を組み合わせて、互換性や最適な機能に応じてタスクをルーティングすることをお勧めします。


イベントレットの有効化

celery worker -Pワーカーオプションを使用して、イベントレットプールを有効にできます。

$ celery -A proj worker -P eventlet -c 1000

Eventletサポートを利用するいくつかの例については、Celeryディストリビューションの Eventlet examples ディレクトリを参照してください。