Geventと互換性のある労働者プロセスのプールを実装する最良の方法は何ですか?
-
27-10-2019 - |
質問
シナリオ
PythonとGeventに実装されたサーバープロセスがあります。これは、TCP/IPを介したバックエンドサービスに接続し、バックエンドサービスによって提供される変更に基づいて、急速に変更された動的コンテンツを使用して多くのWebクライアント(プロセスごとに約1000)にサービスを提供しています。サービスはUbuntu 10.04で実行されており、Windowsで実行されないため、ターゲットプラットフォームは固定されています。現在、Python 2.6.6を使用しています。
問題
多くのクライアントへの変更を提供することで、バックエンドによって送信された変更の処理に遅れを起こす可能性があるため、私の計画はサーバーを複数のプロセスに分割することです。多くのワーカープロセスがWebクライアントにサービスを提供しますが、メインプロセスは引き続きバックエンドサービスに接続されます。私はすでにWebクライアントにサービスを提供するためにグリーンレットの別のプールを使用していますが、ワーカープロセスに入れる必要があります。
質問
Geventの作業プロセスプールの実装を指摘したり、GeventでPython独自のマルチプロセッシングモジュールを正しい方法で使用するにはどうすればよいですか?
制限
Pythonスレッドをプロセスに導入することを避けたいと思います。なぜなら、それはギルの競合の余地を与え、レイテンシーを導入することでパフォーマンスを減らすからです。したがって、可能であれば、きれいなマルチプロセッシング + Geventソリューションになります。
解決
見てみることをお勧めします セロリ -Pythonで記述された分散タスク処理システム。
との基本的なアイデア celery
キューがあるということです(どちらか RabbitMQ
また Redis
)、労働者がPythonプロセスとして書かれ、 celeryd
デーモン。セロリの文書によると、 celeryd
ランニングをサポートします gevent
モードも(ネットワークI/Oバウンドプロセスの場合)、おそらくこの環境で実行するには労働者コードが多くの変更を必要としないでしょう。
他のヒント
カスタムソケットIPCまたはZerOMQを使用することを検討します。