web-dev-qa-db-ja.com

Python Queue vs ZeroMQによるマルチプロセッシングIPC

Python -- ZeroMQ を使用したアプリケーションの作成と ZGuide で説明されているMajordomoパターンのバリエーションの実装に忙しい。

私は、労働者とクライアントの仲介者としてブローカーを持っています。入ってくるすべてのリクエストに対して、いくつかの大規模なロギングを実行したいのですが、ブローカーがそのために時間を浪費したくありません。ブローカーはそのロギング要求を別のものに渡す必要があります。

私は2つの方法を考えました:-

  1. ロギング専用のワーカーを作成し、ZeroMQを使用するIPCトランスポート
  2. キューでマルチプロセッシングを使用する

その点でどちらがより良いか、より速いかわかりません。最初のオプションでは、通常のワーカーで既に使用している現在のワーカー基本クラスを使用できますが、2番目のオプションの方が実装が早いようです。

上記について、または別の解決策について、アドバイスやコメントをお願いします。

10
Imraan

ジョナサンが提案したような標準的なツールを使用するアプローチが好きです。どのOSで作業を行っているかについては触れませんでしたが、同じ精神に従って、Pythonの標準ログモジュールをlogging.handlers.SysLogHandlerと一緒に使用して、ログメッセージを rsyslog に送信することもできます。 =サービス(どのlinux/unixでも利用可能ですが、 windowsオプション もあると思いますが、これを使用したことはありません)。

基本的に、そのシステム全体は、あなたが考えているのと同じものを実装します。ローカルプロセスは、他のユーザーが処理、処理、または書き込むためのログメッセージをキューに入れます。この場合、他の誰か(rsyslog)は、多くの組み込み機能と柔軟性を備えた有名で実績のあるサービスです。

このアプローチのもう1つの利点は、syslogの上に構築された他のsysadminツールと製品がよりよく統合されることです。また、そのオプションを取得するためにコードを記述する必要もありません。

4
DXM

リモートロギングを実装するための3番目の可能性を検討することをお勧めします。標準のPythonロギングモジュールを使用する場合は、ワーカー、クライアント、ブローカーでlogging.QueueHandlerクラスを使用し、リモートロギングプロセスでlogging.QueueListenerクラスを使用することを検討できます。

アプリケーションプロセスとロギングプロセス間のトランスポートとして通常のPython multiprocessing.Queueを使用する代わりに、ダックタイピングでZeroMQを使用して独自のQueue置換クラスを実装し、クラスを標準Python Queue。このようにして、アプリケーションは、単一のマルチコアコンピューターから分散型データセンターまで、どのような環境でも変更せずに実行できます。

まとめると、すべてのワーカー、クライアント、ブローカーでQueueHandlerを使用して標準のPythonロガーを使用し、QueueListenerと選択したPython loggingハンドラーに基づいて独立したプロセスを作成して、重い伐採の解除。

2
Jonathan

これらは根本的に異なるアプローチであり、それぞれに長所と短所のセットがあり、後の開発段階でパンニングする可能性が最も高くなります。

私は2つの方法を考えました:-

  1. ロギング専用のワーカーを作成し、ZeroMQ IPCトランスポートを使用する
  2. キューでマルチプロセッシングを使用する

1つの方法は、アプローチ1と同様に、追加のロギングワーカーを用意することです。ワーカーをmemcacheロギングクラスターにログ記録させ、ロギングワーカーは現在のリソース負荷を監視し、特定のリソース負荷パラメーターを超えると、IOPが制限されたデバイス(ハードディスクなど)にログを記録します。

ジョナサンのアプローチも気に入っています。私が主にPython 2.xを使用しているため、独自のロギングバックエンドを設定してパフォーマンスエンベロープを実際にプッシュする必要がある可能性があります。

私が間違っている場合は訂正してください。しかし、私の見方では、ストレージIOPがボトルネックになっていて、本当にデータ集約的なタスクを実行しているということです。

便利な方法は、ブローカーにbrokerageロギングを記述された形式で実行させ、中央ブローカーインスタンス。たとえば、ブローカーの需要が非常に高く、memcachedログをストレージに書き戻す余裕がない場合は、別のアプローチをとる必要があります。

最終的にはブローカーレスモデルになる可能性があります。それは彼らの間で彼らの仕事を管理している労働者と一緒です。簡単な例では、分散ラウンドロビンアルゴリズムを使用します。

0
Lorenz Lo Sauer