如何将数据放入队列并同时读取?

时间:2013-09-11 23:41:53

标签: python multithreading serial-port queue multiprocessing

我正在尝试将来自串口的一些数据放入多处理队列中,并使用另一个线程从队列中读取此数据,但似乎在完成写入任务之前,队列无法访问以进行读取: /

import Queue  #

cola = Queue.Queue()
s_port = '/dev/ttyUSB' + sys.argv[1]
b_rate = 9600

ser = serial.Serial(
    port=s_port,
    baudrate=b_rate,
    timeout=1
)


class worker: 
    def __init__(self,cola,ser): 
        self.cola = cola 
        self.ser = ser 

    def read_serial(self,ser): 
        ser.flushInput()
        while True : 
            inp = ser.read(size=1) 
            byte = inp.encode('hex')
            print cola.qsize()  #just for debug 
            self.cola.put(byte)

    def go(self): 
        th1 = threading.Thread(target=self.read_serial, args=[ser]) 
        th1.start() 

class worker2: 
    def __init__(self,cola,): 
        self.cola = cola 
        self.ser = ser 

    def getrx(self,cola): 
        while True : 
            rx = self.cola.get()
            print str(rx)
        pass 

    def go2(self): 
        th2 = threading.Thread(target=self.getrx, args=[cola])
        th2.start() 

t = worker(cola,ser)
t.go()
t2 = worker2(cola) 
t2.go2()

任何想法?

1 个答案:

答案 0 :(得分:1)

这里的问题与队列无关。

这一行:

th1 = threading.Thread(target=self.read_serial(ser)) 

...调用self.read_serial(ser),并将结果作为target传递给后台线程运行。这个功能永远运行,所以没有其他任何事情发生。

您要做的是传递方法,而不是调用它。

th1 = threading.Thread(target=self.read_serial, args=[ser]) 

您在worker2中遇到同样的问题,也需要解决这个问题。


所以,一旦你解决了这个问题,以及其他问题,你还需要做些什么才能让一个线程进入队列而另一个线程同时从队列中获取?

无。它只是自动运行。只需在一个帖子中调用put,在另一个线程中调用get即可。如果在读者线程中还没有什么可以得到的话,get只会阻塞而不会返回,直到另一个线程执行put,然后它会立即唤醒。

Here是一个与您的起始代码尽可能相似的示例。 Queue文档中有一个更简单的例子。