From 5e4e1b1ec7d6ce101d6235dd8f2faa0666a12848 Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 7 Jul 2026 17:36:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20DeviceManager=20=E6=AD=BB=E9=94=81=20?= =?UTF-8?q?=E2=80=94=20threading.Lock=20=E6=94=B9=E4=B8=BA=20RLock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: update_from_dev_info/update_loop_data/update_event/update_heartbeat 在 with self._lock 块内调用 get_or_create(), 后者再次 with self._lock. Python threading.Lock 不可重入 → 永久阻塞 → GUI 无响应. 修复: self._lock = threading.RLock() (可重入锁) 清理: mqtt_client.py 移除 debug print 和未使用的 sys import --- DBNMQTTool/dbn_mqtt_tool/device_manager.py | 2 +- DBNMQTTool/dbn_mqtt_tool/mqtt_client.py | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/DBNMQTTool/dbn_mqtt_tool/device_manager.py b/DBNMQTTool/dbn_mqtt_tool/device_manager.py index 0ae1398..a2ce78b 100644 --- a/DBNMQTTool/dbn_mqtt_tool/device_manager.py +++ b/DBNMQTTool/dbn_mqtt_tool/device_manager.py @@ -29,7 +29,7 @@ class DeviceManager: def __init__(self): self._devices: dict[str, DeviceInfo] = {} - self._lock = threading.Lock() + self._lock = threading.RLock() # 可重入锁: update_xxx 内部调用 get_or_create self._callbacks: list[Callable] = [] def on_change(self, callback: Callable): diff --git a/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py b/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py index 33fc4dc..bc6ef70 100644 --- a/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py +++ b/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py @@ -3,7 +3,6 @@ MQTT 客户端封装 """ import json import time -import sys import threading from typing import Callable, Optional from dataclasses import dataclass @@ -123,13 +122,7 @@ class MqttClient: if not self._client or not self._connected: raise ConnectionError("MQTT 未连接") data = json.dumps(payload, ensure_ascii=False) - print(f"[MqttClient] publish topic={topic} qos={qos}", flush=True) - try: - info = self._client.publish(topic, data, qos=qos) - print(f"[MqttClient] publish done mid={info.mid}", flush=True) - except Exception as e: - print(f"[MqttClient] publish EXCEPTION: {e}", flush=True) - raise + self._client.publish(topic, data, qos=qos) def subscribe(self, topic: str, qos: int = 1): """订阅主题"""