Python多线程设备交互:如何确保重置函数独占设备访问?
解决多线程设备访问的锁冲突问题
首先你遇到的'_thread.lock' has no attribute 'aquire'错误是拼写错误——正确的方法名是acquire(少了一个c),不是aquire,这是最直接的问题。
要确保所有设备访问操作(包括数据获取、计算中的设备交互、重置操作)都互斥执行,你需要:
- 统一使用同一个锁实例:不管是
updater、regelung还是reset_to_0,都用同一个threading.Lock()对象来控制设备访问。 - 用
with语句自动管理锁:避免手动调用acquire/release时遗漏释放锁的情况,同时让代码更简洁。
修改后的reset_to_0函数示例:
# 确保lock是全局变量,或者通过参数传入 def reset_to_0(lock): try: with lock: # 这里写重置设备的USB通信代码 print("执行设备重置操作") except Exception as e: log.error(f"Fehler beim Reset: {str(e)}")
同时,updater和regelung里所有访问设备的代码也必须用with lock:包裹,比如:
def updater(lock): while True: with lock: # 从设备获取数据的操作 pass # 非设备操作的逻辑可以放在with块外 time.sleep(0.1) def regelung(lock): while True: with lock: # 计算过程中涉及设备交互的操作 pass time.sleep(0.1)
关于tkinter线程调用reset_to_0的注意点:
如果是UI事件(比如按钮点击)触发重置,直接在回调里调用reset_to_0(lock)即可——因为这里的操作是设备交互,不是UI修改,不需要额外用after方法(除非重置后要更新UI,那才需要回到主线程处理)。
只要所有设备相关操作都通过同一个锁控制,就能彻底避免多线程同时访问USB端口的冲突,也就不会再出现device reports readiness to read but returned no data这类报错。
内容的提问来源于stack exchange,提问作者GlumandaGandalf
相关产品推荐
相关产品推荐

