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

标签 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()。

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

提前谢谢你。

最佳答案

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

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

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

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

关于Python如何让两个不同的线程(A类,B类)共享一个串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043193/

相关文章:

python - Numpy 子数组的外部添加

python - 是否可以使用 Blackboard WebServices 以编程方式将作业提交给 Blackboard

c++ - 在线程中创建 COM 对象

java - JAVA 中的线程和信号量出现问题

c - 修改双指针而不使用memset

c - 在c中使用posix信号量的读写器应用程序中的段错误

python - `import _preamble` 在 Python 中有什么作用?

python - 如何使用PIL(pillow)绘制任何语言的文字?

c# - Razor View 竞争条件

java - 限制java中线程的执行时间示例