You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:18:12