2013-06-27 26 views
5

pythonでIPCの効率的なソリューションを探すときにzeromqを見つけました。私はいくつかのCPUを集中処理する必要があるいくつかのPythonプロセスをマスタープロセスのdictからのデータに持っています。これらのワーカープロセスはdictからのみ読み込みますが、マスタープロセスだけがdictを変更することができます。 dictのデータは変更されますが、マスタープロセスを介して原子的に変更されます。pyzmq zero-copyを使ってデータを共有する

私は理想的には、すべてのワーカープロセスがその辞書を読むことができる共有メモリを持っています。残念ながら、これはPythonでは不可能ではないようです。 Redisのか、memcacheのようなキャッシュを使用

は(ちょうど私がすでにネイティブ形式でメモリのどこかで持っている何かを共有する酸洗TCP &を使用したくない)やり過ぎのように聞こえる...

だから私が好きなの代替として、 zeromqを使用して、zeromq IPCソケットを使用して、マスタdictから関連するデータを購読するワーカーにプッシュします。これは私が(残念ながら)マスターdict(msgpack?を使用して)から関連部分をシリアル化し、zmqメッセージを使用してプッシュする必要があることを意味します。私はゼロコピーを使用してこれを行うことができますので、データを2回コピーすることはできません。これは、msgpackedバイナリ文字列でcopy = Falseを使用すると自動的に発生します。そして、これは私の問題のために行く方法ですか、あるいは皆さんはこれをさらに効率的に取り組むためのヒントを持っていますか?

ありがとうございます!

マルタイン

答えて

3

あなたがcopy=Falseとあなたのmsgpackedバイトを送信する場合は、[はい、(同じことがcopy=Falseと受信側のために行く)送信プロセスのメモリー内のデータの余分なコピーは存在しません。

より複雑なゼロコピー機械のコストは、メッセージがかなり大きくなる(メッセージ当たり約10秒のクロスオーバー)まで、コピー自体のコストよりも大きいことが多いため、パフォーマンステストを必ず実行してください。

代わりに、組み込みのマルチプロセッシングモジュールのfacilities for shared dataを使用することもできます。それは最も素晴らしいものではありませんが、かなり簡単なことのために仕事を終わらせることができます。

+0

ありがとうございました。おそらく、10kB以上10kB未満のメッセージがあるので、私はいくつかのベンチマーキングを行う必要があります。 Pythonプロセス間でIPCを実行する最も効率的な方法についてはコンセンサスがありますか? ?マルチプロセッシングパッケージを使用し、パイプを使用するだけですか? – Martijnh

+0

IPCにはさまざまな方法がありますが、さまざまなツールは作業負荷によってさまざまな利点があります。私はコンセンサスが多いとは思わないが、ZeroMQは比較的人気がある。 – minrk

関連する問題