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

Jai*_*ime 2 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()
Run Code Online (Sandbox Code Playgroud)

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

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

先感谢您.

Eli*_*sky 12

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

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

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

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