我有一个使用串行端口(唯一资源)的 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/