在python中侦听线程事件

时间:2015-07-09 11:44:26

标签: python events python-multithreading pyserial

第一次SO用户,请原谅任何礼仪错误。我正在尝试在python中实现多线程程序并遇到麻烦。毫无疑问,由于缺乏对线程如何实现的理解,但希望你能帮我解决这个问题。

我有一个基本程序,它不断地监听串口上的消息,然后可以打印/保存/处理/等等,这很好。它基本上是这样的:

import serial
def main():
    usb = serial.Serial('/dev/cu.usbserial-A603UBRB', 57600) #open serial w\ baud rate
    while True:
        line = usb.readline()
        print(line)

但是,我想要做的是不断地在串口上监听消息,但不一定要对它们做任何事情。这应该在后台运行,同时在前台我希望有一些界面,用户可以命令程序读取/使用/保存这些数据一段时间然后再次停止。

所以我创建了以下代码:

import time
import serial
import threading

# this runs in the background constantly, reading the serial bus input
class serial_listener(threading.Thread):
    def __init__(self, line, event):
        super(serial_listener, self).__init__()
        self.event = threading.Event()
        self.line = ''
        self.usb = serial.Serial('/dev/cu.usbserial-A603UBRB', 57600)

    def run(self):
        while True:
            self.line = self.usb.readline()
            self.event.set()
            self.event.clear()
            time.sleep(0.01)

# this lets the user command the software to record several values from serial
class record_data(threading.Thread):
    def __init__(self):
        super(record_data, self).__init__()
        self.line = ''
        self.event = threading.Event()
        self.ser = serial_listener(self.line,self.event)
        self.ser.start() #run thread

    def run(self):
        while(True):
            user_input = raw_input('Record data: ')
            if user_input == 'r':
                event_counter = 0
                while(event_counter < 16):
                    self.event.wait()
                    print(self.line)
                    event_counter += 1

# this is going to be the mother function
def main():
    dat = record_data()
    dat.start()

# this makes the code behave like C code.    
if __name__ == '__main__':
    main()    

它编译并运行,但是当我通过在CLI中键入r来命令程序记录时,没有任何反应。它似乎没有收到任何事件。

任何线索如何使这项工作?解决方法也很好,唯一的问题是我不能经常打开和关闭串行接口,它必须一直保持打开状态,否则设备会停止工作直到解锁/重新插入。

1 个答案:

答案 0 :(得分:1)

我建议使用多个进程,而不是使用多个线程。使用线程时,必须考虑全局解释器锁。所以你要么听事件要么在主线程中做点什么。两者同时不起作用。

当使用多个进程时,我会使用一个队列来转发您想要处理的监视程序中的事件。或者您可以编写自己的事件处理程序。 Here您可以找到多进程事件处理程序的示例