Python如何与两个不同的线程共享串行端口(A类,B类)

时间:2010-10-28 13:06:48

标签: python multithreading semaphore

我有一个使用串口(唯一资源)的Python进程,它使用类A的实例进行管理。使用类B和C的实例初始化了两个不同的线程,它们不断使用串行端口资源通过已经创建的对象。

import threading

Class A(threading.Thread):
    #Zigbee serial port handler
    def __init__(self,dev):
        #something here that initialize serial port
    def run():
        while True:
            #listening serial interface
    def pack(self):
        #something
    def checksum(self):
        #something
    def write(self):
        #something

Class B(threading.Thread):
    def __init__(self,SerialPortHandler):
        self.serialporthandler=SerialPortHandler
    def run(self)
        while True:
            #something that uses self.serialporthandler

Class C(threading.Thread):
    def __init__(self,SerialPortHandler):
        self.serialporthandler=SerialPortHandler
    def run(self)
        while True:
            #something that uses self.serialporthandler

def main():
    a=A('/dev/ttyUSB1')
    b=B(a)
    b.start()
    c=C(a)
    c.start()

if __name__=='main':
    while True:
        main()

问题是两个线程都试图同时访问串行资源。我可以使用同一个类A的几个实例,在敏感部分附加Lock.acquire()和Lock.release()。

你们有些人能指出我的正确方法吗?

提前谢谢。

2 个答案:

答案 0 :(得分:12)

虽然可以使用适当的锁定来共享串口,但我不推荐它。我已经编写了几个在Python的串口上进行通信的多线程应用程序,根据我的经验,以下方法更好:

  • 在一个线程中有一个类通过一个或两个Queue对象来管理实际的串口通信:
    • 从端口读取的东西放入队列
    • 发送到端口的命令放入队列,“串行线程”发送给它们
  • 让其他线程通过将事物放入队列并解决问题来实现逻辑

使用Queue个对象将大大简化您的代码并使其更加健壮。

这种方法在设计方面为您提供了很多可能性。例如,您可以使用串行线程管理器注册事件(回调),并在发生有趣事件时让它(以同步方式)调用它们等。

答案 1 :(得分:0)

threading.Lock()添加到class A并使其在使用时获取锁定:

def __init__(self,dev):
    self.lock = threading.Lock()

def read(self):
    self.lock.acquire()
    data = ? #whatever you need to do here to read
    self.lock.release()
    return data

def write(self, data):
    self.lock.acquire()
    #whatever you need to do to write
    self.lock.release()