2009-08-30 10 views
0

マルチプロセッシングでrpcを実行するには良い方法はありますか? プロセスA * 10、プロセスB * 1.各プロセスAは、特定のアイテムを照会する必要があるかどうかをプロセスBで確認する必要があります。マルチプロセッシングのためのRPC、設計上の問題

私はマルチプロセッシングを実装しようと考えていました.Pipe()オブジェクトをすべてのAsに対して使用し、それぞれのBをリッスンします。しかし、私はMultiprocessing.Pipe.recvがブロックしていることを認識しています。だから私はこれをどうやってやっていくことができるのか本当に分かっていない。 (もし私がループを使ってループがブロックされる相手を介して送信されたものがあるかどうかを確認するのであれば)。

私はねじれを使用するための提案がありますが、私はねじれでこれを行う方法についてはわかりません:すべてのプロセスAから各pipe.handlerに遅延を作成する必要があります。それは何かを進めて、一定のルーチンを完了させるものですか?私は個人的にツイストがマルチプロセッシングとうまく混合しないことを知っていますが、マルチプロセッシングの実装の子プロセスであるツイストのテストを行っています。

推奨事項

答えて

6

個人的には、ソケットベースのRPCに向かって傾いている傾向があります。これは、より多くの展開が必要な場合に、単一のノードの境界から解放されるためです。 Twistedはソケットベースの通信を処理する優れた方法を提供しますが、もちろん他の選択肢もあります。 HTTP 1.1は、一般にファイアウォールを簡単に通過するため、セキュリティを必要とする場合やHTTPSに簡単に移行できるため、このような目的で使用するための優れた「トランスポート」レイヤーです。それ以上のペイロードに関しては、私はJSONを好んでいくのに多少の偏見があるかもしれませんが、XMLや他の多くのエンコーディングと比べるとすばらしい時間を過ごしました。私は、Googleのprotobufsがオープンソース化されたので、彼らも魅力的であると認めなければならないが(特に内部的に使用するもの、ほぼ独占的である - 確かにそれに慣れている。残念ながら、HTTP経由でのprotobufsの特定のRPC実装はオープンソース化されていませんが、あなた自身のためにそれを調理するのは難しくありません。

1

REST-fulトランザクション設計の使用に満足しています。

これは、パイプの代わりにHTTPを使用することを意味します。

プロセスBには、さまざまなプロセスAの処理のキューがある場合、このように動作します。

プロセスBは、プロセスAからのクエリを処理するRESTful URIを持つHTTPサーバーです。 Bは、Python wsgirefまたはwerkzeugまたは他のWSGI実装を使用して実装されています。

ほとんどの場合、BはAからのGET要求に応答します。各GET要求はキューから次のものを取り出し、それに応答します。 Bは複数の同時要求を持つため、ある種のシングルスレッドキューが不可欠です。これを保証する最も簡単な方法は、WSGIサーバーがシングルスレッドであることを保証することです。各リクエストは比較的高速ですので、シングルスレッド処理は非常にうまく動作します。

Bにはキューがロードされている必要があります。そのため、おそらくPOST要求にも応答してエンキューします。

プロセスAはHTTPクライアントであり、プロセスBが提供するRESTfulなURIを要求します。 Aはurllib2を使用して実装され、Bの要求を行います。AはBのGET要求を行い、キューから次のものを取得します。

0

あなたはMPIを見ましたか? http://en.wikipedia.org/wiki/Message_Passing_Interface

これは、UNIX/Linux /などで広く利用できます。私はWindows上でそれができると信じています。基本的には、RPCメカニズムの上に構築する必要のあるすべての配管を提供しています。また、その背後には長年の開発と洗練があります。これはもともとC言語で行われているAPIの仕様であり、C++でも動作しますし、Pythonの実装もあります。

関連する問題