Python-如何在同一线程上等待条件变量和/或I / O事件?

时间:2018-10-20 19:11:33

标签: python wait zeromq

在我的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)

0 个答案:

没有答案