在我的Python程序中,我有一个线程,该线程从其他线程接收消息,并通过PythonZMQ将消息发送到远程计算机,并从其接收响应。
由于ZMQ套接字are not thread-safe,我想在同一线程中处理消息的发送和接收。 要发送的消息可以由queue传递,而新消息的到达可以由condition variable发出信号,因此我应该使用Condition.wait方法等待它。 虽然应该在pyzmq poll函数中等待响应的到来。问题是我不能同时等待Condition.wait和pyzmq poll。
我可以看到一种解决方法-使用ZMQ套接字将要从其他线程发送的消息传输到处理远程通信的线程。但是,这似乎太过分了。可以用更简单的方式完成吗?
示例代码(使用ZMQ代替队列)
生成消息,将它们发送到处理器并接收响应的主要过程:
import zmq
import time
import random
import threading
#Thread that delivers the messages
def msg_source(zctx):
#Prepare the socket for communication with the message receiver
s=zctx.socket(zmq.PAIR)
s.connect('inproc://src')
while True:
r=random.Random()
time.sleep(1+2*r.random())
print(".")
s.send("msg "+str(time.time()))
#Initialize the context
ctx=zmq.Context()
#Prepare the socket for communication with the message source
s1=ctx.socket(zmq.PAIR)
s1.bind('inproc://src')
#Prepare the socket for communucation with the message processor
s2=ctx.socket(zmq.PAIR)
s2.connect('tcp://0.0.0.0:8998')
t=threading.Thread(target=msg_source, args=(ctx,))
t.daemon = True
t.start()
p=zmq.Poller()
p.register(s1,flags=zmq.POLLIN)
p.register(s2,flags=zmq.POLLIN)
while True:
e=p.poll()
for tp in e:
if tp[0]==s1:
m=s1.recv()
s2.send(m)
print("s1:"+m)
if tp[0]==s2:
m=s2.recv()
print("s2:"+m)
接收消息并发送响应的“处理器” 导入zmq 导入时间 随机导入
r=random.Random()
#Initialize the context
ctx=zmq.Context()
#Prepare the socket for communication with message source
s2=ctx.socket(zmq.PAIR)
s2.bind('tcp://0.0.0.0:8998')
while True:
#Receive the message
m=s2.recv()
print("received:"+m)
#Send response after a random time
time.sleep(1+r.random())
m+=" - response "+str(time.time())
s2.send(m)
print("answered:"+m)