1

まず、私のコード (主に ZMQ doc http://zguide.zeromq.org/py:mtserverからインスピレーションを得ています):

import zmq
import time
import sys
import threading

#SOCKET_NAME = "tcp://127.0.0.1:8000"
SOCKET_NAME = "inproc://mysocket"

def dealerRoutine(context):
    socket = context.socket(zmq.DEALER)
    socket.bind(SOCKET_NAME)
    time.sleep(12)
    socket.send("hello")
    socket.send("hello")
    print socket.recv()
    print socket.recv()
    socket.close()


def workerRoutine(context):
    socket = context.socket(zmq.REP)
    socket.connect(SOCKET_NAME)
    s = socket.recv()
    print s
    socket.send("world")

context = zmq.Context()

workers = []
for i in range(0, 2):
    worker = threading.Thread(target=workerRoutine, args=([context]))
    workers.append(worker) 
    worker.start()

dealerRoutine(context)

for worker in workers:
    worker.terminated = True

context.term()

このコードを inproc ソケットと tcp ソケットの両方で試しました。

  • ワーカーが接続しようとすると inproc がエラーを出す
  • TCP はディーラーでの送信後待機するだけで、ワーカーからの印刷は表示されず、ディーラーで他のメッセージは受信されません。
  • ジョイナーが遅い問題を考えて、スリープを追加します (ワーカーが接続する前に 1 つ、ディーラーの send() の前に 1 つ) : これにより、inproc が TCP と同じように動作します。

PS : camelCase には申し訳ありませんが、ハマっています。

4

1 に答える 1

3

私はそれを次のように機能させました:

  • ディーラーの場合、メッセージをマルチパートで送信します。最初の部分は空のメッセージで、2 番目の部分はあなたのメッセージです
  • タイマーを減らしました(それは役に立ちませんでした)

コードは次のとおりです。

import zmq
import time
import sys
import threading

SOCKET_NAME = "tcp://127.0.0.1:8000"
#SOCKET_NAME = "inproc://mysocket"

def dealerRoutine(context):
    socket = context.socket(zmq.DEALER)
    socket.bind(SOCKET_NAME)
    time.sleep(1)
    socket.send("", zmq.SNDMORE)
    socket.send("hello")
    socket.send("", zmq.SNDMORE)
    socket.send("hello")
    print socket.recv()
    print socket.recv()
    socket.close()


def workerRoutine(context):
    socket = context.socket(zmq.REP)
    socket.connect(SOCKET_NAME)
    s = socket.recv()
    print s
    socket.send("world")

context = zmq.Context()

workers = []
for i in range(0, 2):
    worker = threading.Thread(target=workerRoutine, args=([context]))
    workers.append(worker) 
    worker.start()

dealerRoutine(context)

for worker in workers:
    worker.terminated = True

context.term()
于 2012-10-16T20:59:25.330 に答える