9

次のことを行うスクリプト ( parentpythonと呼びます)を書きたいと思います。

(1)多次元numpy配列を定義する

(2) forks 10 種類pythonのスクリプト ( childrenと呼びます)。それらのそれぞれは、(生きている限り)任意の時点で(1)から配列readの内容にアクセスできる必要があります。numpy

(3)スクリプトはそれぞれ独自の作業を行います (は互いに情報を共有しません)。

(4)任意の時点で、親スクリプトはすべてのからのメッセージを受け入れることができなければなりません。これらのメッセージは親によって解析され、(1)numpy配列が変更されます。


環境で作業pythonする場合、どうすればよいですか? Linux私は、がすべてパブリッシャーになる一方でzeroMQを単一のサブスクライバーにすることを考えました。それは理にかなっていますか、それともより良い方法がありますか?

また、すべての子がによって定義された配列の内容を継続的に読み取れるようにするにはどうすればよいですか?numpy

4

3 に答える 3

18

チャネルはsubバインドする必要がないため、サブスクライバーをバインドでき、各子pubチャネルはそれに接続してメッセージを送信できます。この特定のケースでは、multiprocessingモジュールの方が適していると思いますが、言及するのは面倒だと思いました:

import zmq
import threading

# So that you can copy-and-paste this into an interactive session, I'm
# using threading, but obviously that's not what you'd use

# I'm the subscriber that multiple clients are writing to
def parent():
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.setsockopt(zmq.SUBSCRIBE, 'Child:')
    # Even though I'm the subscriber, I'm allowed to get this party 
    # started with `bind`
    socket.bind('tcp://127.0.0.1:5000')

    # I expect 50 messages
    for i in range(50):
        print 'Parent received: %s' % socket.recv()

# I'm a child publisher
def child(number):
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    # And even though I'm the publisher, I can do the connecting rather
    # than the binding
    socket.connect('tcp://127.0.0.1:5000')

    for data in range(5):
        socket.send('Child: %i %i' % (number, data))
    socket.close()

threads = [threading.Thread(target=parent)] + [threading.Thread(target=child, args=(i,)) for i in range(10)]
for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

特に、ドキュメントのCore Messaging Patternsの部分では、パターンのどちらかがバインドできる (そしてもう一方が接続できる) という事実について説明しています。

于 2012-05-22T03:37:18.200 に答える
4

ベンチレーターとシンクが同じプロセスであることを除いて、標準的なベンチレーター - ワーカー - シンクのシナリオがあるため、PUSH/PULL ソケットを使用する方が理にかなっていると思います。

また、 ZeroMQ の代わりにmultiprocessingモジュールの使用を検討してください。それはおそらく少し簡単になるでしょう。

于 2011-07-14T21:46:18.903 に答える
-2

ZeroMQでは、ポートごとに1つのパブリッシャーしか存在できません。唯一の(醜い)回避策は、各子PUBソケットを異なるポートで開始し、親にそれらすべてのポートでリッスンさせることです。

しかし、パイプラインパターンは0MQで説明されており、ユーザーガイドはこれを行うためのはるかに優れた方法です。

于 2011-07-26T14:07:32.897 に答える