Python 多线程和ZMQ经销商/代表hello world不';行不通
首先,我的代码(主要灵感来自ZMQ文档): 我已经用inproc和tcp套接字尝试了这段代码Python 多线程和ZMQ经销商/代表hello world不';行不通,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,首先,我的代码(主要灵感来自ZMQ文档): 我已经用inproc和tcp套接字尝试了这段代码 inproc在工作人员尝试连接时出错 TCP只是在发送到经销商上后等待,没有来自worker的打印,经销商上没有收到其他消息 我考虑了慢连接问题,并添加了一个睡眠(一个在工作人员连接之前,一个在经销商的send()之前):这只会导致inproc的行为与TCP相同 PS:我为camelCase感到抱歉,但我对它上瘾了。我是通过以下方式实现的: 对于经销商,多部分发送您的信息,第一部分为空信息,第二部
- inproc在工作人员尝试连接时出错
- TCP只是在发送到经销商上后等待,没有来自worker的打印,经销商上没有收到其他消息
- 我考虑了慢连接问题,并添加了一个睡眠(一个在工作人员连接之前,一个在经销商的send()之前):这只会导致inproc的行为与TCP相同
- 对于经销商,多部分发送您的信息,第一部分为空信息,第二部分为您的信息
- 减少了计时器(但那个没用)
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()
感谢minrk对0 MQ专用IRC的帮助,问题在于多部分消息。读者可能会使用send_multipart(['',hello']),这相当于您使用zmq.SNDMORE标志所做的操作。对于发送到DealRoutine的所有内容,DealRoutine需要接收两次。因此,在本例中,它需要4个
print socket.recv()
语句。。。如果你尝试一下,你会发现它只在第二张和第四张上打印“世界”。不过,我还没有找到ZMQ中记录的地方。
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()