ZMQ で REP/DEALER 接続をセットアップしたところ、REP が 1 つのメッセージを DEALER に送信すると、DEALER はメッセージを取得するために 2 回受信する必要があることがわかりました。どうしてこれなの?
これを複製するコードは、この SO answerのコードの修正版です。彼らのコードはワーカーごとに 1 回しか受信しませんが、これをテストしたところ、1 つの「ワールド」しか返されませんでした。2つの「世界」を取り戻すには、4回受け取る必要がありました。
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 "first msg", socket.recv()
print "second msg", socket.recv()
print "third msg", socket.recv()
print "fourth msg", socket.recv()
socket.close()
def workerRoutine(context):
socket = context.socket(zmq.REP)
socket.connect(SOCKET_NAME)
s = socket.recv()
print "worker received", 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()