2

非常に特殊なデータ処理デーモンを作成する必要があります。

マルチプロセッシングで動作する可能性があると私が考えた方法は次のとおりです。

  • プロセス #1: いくつかの重要なメタデータを取得するための 1 つのプロセス。それらは毎秒取得できますが、それらのデータはプロセス #2 で利用できる必要があります。プロセス #1 がデータを書き込み、プロセス #2 がデータを読み取ります。

  • プロセス #2: プロセス #1 で受け取ったものに基づいて実際のデータをフェッチする 2 つのプロセス。フェッチされたデータは (大きな) キューに格納され、「後で」処理されます。

  • プロセス #3: プロセス #2 で作成されたキューをポーリングし、それらのデータを処理する 2 つ (またはそれ以上) のプロセス。完了すると、新しいキューがいっぱいになり、プロセス #4 で使用されます

  • プロセス #4 : プロセス #3 によって満たされたキューを読み取り、結果を HTTP 経由で送り返す 2 つのプロセス。

これらすべての異なるプロセスの背後にある考え方は、それらを可能な限り専門化し、可能な限り独立させることです。

これらのプロセスはすべて、ここに実装されているメイン デーモンにラップされます。

multiprocessing.Process特にデーモン化されるメインの親プロセス内でデーモン(es)を実行する場合、私が想像したことが関連/愚か/オーバーキル/などであるかどうか疑問に思っています。さらに、潜在的なロックの問題について少し心配しています。理論的には、データを読み書きするプロセスは異なる変数/構造を使用するため、いくつかの問題を回避できるはずですが、それでも心配です。

おそらく、私のコンテキストにマルチプロセッシングを使用することは正しいことではありません。これについてのフィードバックをいただければ幸いです。

ノート :

  • Redis をデータ構造サーバーとして使用できません
  • IPC に ZeroMQ を使用することも考えましたが、マルチプロセッシングでも同じように機能する場合は、別の追加ライブラリを使用することは避けます。

フィードバックをお寄せいただきありがとうございます。

4

1 に答える 1

0

一般的に、さまざまなタスクを持つさまざまな労働者の部門と、彼らがコミュニケーションできるようにする計画は、すでにうまくいっています。ただし、処理ステップが I/O または CPU バウンドである場合は常に注意する必要があります。もしあなたが I/O バウンドなら、できる限りスレッド化モジュールを使いたいと思います: 共有メモリが許可されているので、アプリケーションのメモリ フットプリントが小さくなり、スレッド間の通信がより効率的になります。追加の CPU パワーが必要な場合にのみ、マルチプロセッシングを使用してください。お使いのシステムでは、両方を使用できます (プロセス 3 (またはそれ以上) が負荷の高い計算を行うように見えますが、他のワーカーは主に I/O バウンドになります)。

于 2012-09-11T11:30:18.697 に答える