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を使用すると自動的に発生します。そして、これは私の問題のために行く方法ですか、あるいは皆さんはこれをさらに効率的に取り組むためのヒントを持っていますか?
ありがとうございます!
マルタイン
ありがとうございました。おそらく、10kB以上10kB未満のメッセージがあるので、私はいくつかのベンチマーキングを行う必要があります。 Pythonプロセス間でIPCを実行する最も効率的な方法についてはコンセンサスがありますか? ?マルチプロセッシングパッケージを使用し、パイプを使用するだけですか? – Martijnh
IPCにはさまざまな方法がありますが、さまざまなツールは作業負荷によってさまざまな利点があります。私はコンセンサスが多いとは思わないが、ZeroMQは比較的人気がある。 – minrk