まず、私のコード (主に 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 には申し訳ありませんが、ハマっています。