0

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

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()

有任何想法吗?

4

1 回答 1

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则只会阻塞而不返回,直到另一个线程执行 a put,然后它会立即唤醒。

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

于 2013-09-11T23:58:29.480 回答