這是一個簡單的req-rep服務。通常zmq.REP和zmq.REQ就足夠了,但這不是我正在構建的應用程序。以下是執行客戶端服務器通信的腳本。服務器在一個線程中運行。溝通按預期工作。客戶端發送消息,服務器接收消息,然後向接收消息的客戶端發送消息。ZeroMQ路由器和經銷商是否必須在相同的(Python)過程中才能實現雙向通信?
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在單獨的腳本中運行,因此獨立的進程。
不,它們可以是在單獨的進程,獨立的可執行文件,在不同的計算機上或獨立的網絡。其他一些問題 – Jason 2015-03-25 18:30:31