0

multiprocessing.Process で rpc を実行する良い方法は何ですか?

また、プロセス A * 10、プロセス B * 1 のアーキテクチャに関する設計アドバイスも受け付けています。各プロセス A は、特定のアイテムを照会する必要があるかどうかをプロセス B に確認する必要があります。

そこで、すべての As に対して multiprocessing.Pipe() オブジェクトを実装し、B にそれぞれをリッスンさせることを考えていました。しかし、Multiprocessing.Pipe.recv が BLOCKING であることがわかりました。そのため、どうすればこれを行うことができるのか本当にわかりません。(ループを使用して、ループがブロックされる相手側から送信されたものを確認する場合)。

ツイストを使用するための提案がありますが、ツイストでこれを行う方法がわかりません: すべてのプロセス A から各 pipe.handler に defer を作成し、recv() が何かを受け取ると、それが続行されます。特定のルーチンを完了しますか?私は個人的にツイストがマルチプロセッシングとうまく混ざらないことを知っていますが、マルチプロセッシング実装の子プロセスであるツイストでいくつかのテストを行い、今回は実行可能だと思います。

推奨事項はありますか?

4

3 に答える 3

6

個人的には、私は常にソケットベースのRPCに傾倒する傾向があります。これは、さらに拡張する必要がある場合に、単一ノードの制限から解放されるためです。Twistedは、ソケットベースの通信を処理するための優れた方法を提供しますが、もちろん他の方法もあります。HTTP 1.1は、通常ファイアウォールを簡単に通過するため、このような目的に使用するのに最適な「トランスポート」層であり、セキュリティが必要な場合にもHTTPSに簡単に移行できます。ペイロードに関しては、JSONを好むのは少し変わっているかもしれませんが、XMLや他の多くのエンコーディングと比較して素晴らしい時間を過ごしました。私はそれを認めなければなりませんが、今ではグーグルのprotobufsオープンソースであり、彼らも魅力的です(特に、それらは私たちが内部で使用しているものであり、ほとんど排他的に-確かにそれらに慣れています;-)。HTTPを介したprotobufsの特定のRPC実装がオープンソース化されていないことを残念に思います...しかし、自分で作成するのはそれほど難しくありません;-)。

于 2009-08-30T04:34:10.860 に答える
1

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

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

プロセスBにさまざまなプロセスAが実行するためのキューがある場合、このように機能します。

プロセスBはHTTPサーバーであり、プロセスAからのクエリを処理するRESTfulURIを備えています。Bは、 Pythonwsgirefまたはwerkzeugまたはその他のWSGI実装を使用して実装されます。

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

Bはキューをロードする必要があるため、POST要求にも応答してキューに入れる可能性があります。

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

于 2009-08-30T11:41:22.560 に答える
1

MPIを見たことがありますか?http://en.wikipedia.org/wiki/Message_Passing_Interface

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

于 2009-10-14T21:57:29.377 に答える