【发布时间】:2015-06-15 04:15:30
【问题描述】:
这是一个简单的 req-rep 服务。通常 zmq.REP 和 zmq.REQ 就足够了,但这不是我正在构建的案例应用程序。下面是一个执行客户端服务器通信的脚本。服务器在一个线程中运行。通信按预期工作。客户端发送消息,服务器接收消息,然后发送消息给客户端,客户端接收消息。
import time
from threading import Thread
import zmq
def worker_thread():
cxt = zmq.Context.instance()
worker = cxt.socket(zmq.DEALER)
worker.setsockopt(zmq.IDENTITY, 'A')
worker.connect("tcp://127.0.0.1:5559")
for _ in range(10):
request = worker.recv()
print 'worker recieved'
worker.send_multipart(['A', "data_recieved"])
cxt = zmq.Context.instance()
client = cxt.socket(zmq.ROUTER)
client.bind('tcp://127.0.0.1:5559')
Thread(target=worker_thread).start()
time.sleep(2)
for _ in range(10):
client.send_multipart(['A', 'data'])
request = client.recv()
print 'worker responded'
当这段代码被分成两个脚本,客户端和服务器时,通信失败。客户端发送消息,但服务器从不接收它。代码如下:
客户:
import time
import zmq
cxt = zmq.Context.instance()
client = cxt.socket(zmq.ROUTER)
client.bind('tcp://127.0.0.1:5559')
for _ in range(10):
client.send_multipart(['A', 'data'])
request = client.recv()
print 'worker responded'
服务器:
import time
import zmq
cxt = zmq.Context.instance()
worker = cxt.socket(zmq.DEALER)
worker.setsockopt(zmq.IDENTITY, 'A')
worker.connect("tcp://127.0.0.1:5559")
for _ in range(10):
request = worker.recv()
print 'worker recieved'
worker.send_multipart(['A', "data_recieved"])
我能想到的唯一可能导致通信失败的原因是 zmq.ROUTER 和 zmq.DEALER 在单独的脚本中运行,因此是单独的进程。
【问题讨论】:
-
不,它们可以位于不同的进程、不同的可执行文件、不同的计算机或不同的网络上。其他一些问题