我有一个使用串口(唯一资源)的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()。
你们有些人能指出我的正确方法吗?
提前谢谢。
答案 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()