从其他线程获取队列

时间:2015-03-21 18:49:18

标签: python multithreading queue

我正在开发一个脚本,我希望有2个线程。其中一个将继续读取串口,另一个将监听zmq。

我想使用第一个线程的队列知道何时停止读取串口。所以我想要第二个线程,每次从zmq收到消息时都用一个字符填充队列。

我已经有了这个:

导入序列号       导入结构       导入线程       导入系统       导入zmq       来自队列导入队列

  ser = serial.Serial('/dev/ttyUSB0', 38400)
  port = "5556"

  q = Queue(maxsize=0)
  #q = []

  context = zmq.Context()
  socket = context.socket(zmq.SUB)
  socket.connect("tcp://localhost:%s"% port)
  socket.setsockopt(zmq.SUBSCRIBE,'')

  class ReadingThread(threading.Thread):
    def __init__(self):
      super(ReadingThread, self).__init__()
    def run(self):
      while True:
        if q.empty() == False:
            for element in q:
              print element
        data= ser.read()          print "INT", data

  class ZMQThread(threading.Thread):
    def __init__(self):
      super(ZMQThread, self).__init__()
    def run(self):
      while True:
        msg = socket.recv()
        #print "RECIBIDO"
        q.put(msg)

  thread1 = ReadingThread()
  thread1.start()
  thread2 = ZMQThread()
  thread2.start()

但是每当第一个线程到达q.empty()的行时,它就会崩溃:

TypeError: iteration over non-sequence

我还在q中测试了一个for元素:......但结果相同。

如何从第一个线程中使用队列?

1 个答案:

答案 0 :(得分:1)

TypeError而非for element in q:引起的

q.empty()。因为Queue类没有为for-statement提供__iter__()__getitem__()方法。

您应该使用get()方法来检索元素。