我正在开发一个脚本,我希望有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元素:......但结果相同。
如何从第一个线程中使用队列?
答案 0 :(得分:1)
TypeError
而非for element in q:
引起的 q.empty()
。因为Queue
类没有为for-statement提供__iter__()
或__getitem__()
方法。
您应该使用get()
方法来检索元素。