2012-03-24 12 views
3

私はpythonとzeromqを使って動作するアプリケーションを持っています。私はそれを最適化したいと思います。pythonとzeromqでタスクを配布する

簡単に言えば、マスターノードはすべての作業者(約200人)に同じ要求を送信し、次に回答を収集します。答えに基づいて、1つのノードにメッセージを戻し、ノードは応答します。

今、私は非常に単純なパターンを実装しました。各作業者には1つのREPソケットがあり、サーバーにはREQソケットのリストがあります。サーバーは、一般的なメッセージを送信するすべてのソケットを反復し、すべてのソケットを反復して応答を収集します。最後に、サーバーは回答に基づいて1人のワーカーを選択し、メッセージを送信して応答を待ちます。

これはもちろん、かなり遅いです。最も遅い部分は同じメッセージを200回送信しています。収集も遅いです。私がタスクを配布し、回答を収集するために見つけた解決策は、私が必要とするものではない負荷分散を行います。私は各作業員がメッセージを受け取り応答する必要があります。

この状況ではどのようなパターンが推奨されますか?

ありがとうございました

+0

「この状況に適したパターンは何ですか?」とはどういう意味ですか? – Marcin

+0

たとえば、独立したタスクを処理する必要がある場合は、ベンチレータパターンを使用して、ここに記載されているようにタスクを配布できます。http://taotetek.wordpress.com/2011/02/02/python-multiprocessing-with-zeromq/ – Hernan

+0

私はパターンが何であるか知っています。実際にあなたが何をしているのか、現在のソリューションのどの部分が必要なのか、またメッセージの配信が遅いのかについては、実際には説明していません。 「物事を配布するのが遅い」という古典的な解決策は、物事を配布しない、または物事を分散させないことです。 – Marcin

答えて

0

私はzmqを知らないです。 3140

を送信:*(約200)

マスターPUBのバインドが

マスターノードのすべての労働者に同じ要求を送信します。ここでは動作しない場合がありますパターン、ちょうど始めるためにです労働者は、SUB MASTERHOSTを接続する:3140は答えに

を収集し、その後にrecv

をSUBSCRIBE 3141は

マスターPULLバインド*送信:

ワーカーPUSHがMASTERHOSTを接続する回答に基づいて3141のrecv

を、それが戻って一つのノードにメッセージを送信し、バックノードの答え。

マスターREQ workerhost接続:3142センドのrecv

ワーカーREPバインド*:各ワーカーは異なる仕事、パブ/サブ文句を言わない作業を必要とする必要がある場合は3142のrecvが

+0

私はついにこれを実装してテストする時間がありました。最初の部分(同じタスクを配布する)は、200ソケットをループする代わりにpub/subを使って配布するので、100倍高速です。 2番目のパート(回答を集める)はまだ遅くなります(8ミリ秒かかる)。私がやっていることは、recvをpullソケットで200回呼び出すことです。 zeromqに伝える方法はありますか?「200個のメッセージを待ち、準備が整ったらそれらを配列として返しますか? – Hernan

+0

なぜ、「準備が整ったら、200のメッセージを待ってアレイとして返しますか?他の何かが減速しない限り、私はあなたが試してみることができるメッセージを引き出すために多くのスレッドを使用したほうが速いと思います。 –

+2

@AaronWatters:0MQソケットはスレッドセーフではありません。 **スレッド間で共有しないでください**。 – jfs

2

を送ります。あなたが必要とするのは、ワーカープール実装です。ラウンドロビン形式のジョブをプッシュアウトするか(サーバー上のプッシュソケットを使用し、各クライアントからプルします.zeromqはラウンドロビンを実行します)、または各ワーカーがサーバーからジョブを要求します。ジョブは少なくとも最小限の複雑さを要し、ジョブ間の分散は高く、より良いアプローチです。そのホームページで、ネット上のzeromqガイドの多くの例があります。

具体的な実装にも依存しますジョブを確実に処理する必要があるかどうかを判断します。

+0

ありがとうございますが、私の質問に記載されているように、各ワーカーは同じことをします(しかし、データのそれ自身の部分で)。 – Hernan

関連する問題