From 4632ae74f391df5d44668a90fe941e356a541e34 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Fri, 30 Jan 2026 15:15:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - algorithms.py 添加 threading/redis/logger 导入 - ResultReporter 添加 report_heartbeat() 和 close() 方法 --- algorithms.py | 5 + .../__pycache__/config_models.cpython-310.pyc | Bin 8168 -> 8610 bytes config/__pycache__/database.cpython-310.pyc | Bin 9145 -> 19830 bytes config/__pycache__/settings.cpython-310.pyc | Bin 6509 -> 7173 bytes core/__pycache__/config_sync.cpython-310.pyc | Bin 13247 -> 18121 bytes .../result_reporter.cpython-310.pyc | Bin 17287 -> 11970 bytes .../tensorrt_engine.cpython-310.pyc | Bin 12357 -> 12466 bytes core/result_reporter.py | 35 ++++++ logs/main.log | 117 ++++++++++++++++++ logs/main_error.log | 41 ++++++ 10 files changed, 198 insertions(+) diff --git a/algorithms.py b/algorithms.py index b0ed343..fc70e03 100644 --- a/algorithms.py +++ b/algorithms.py @@ -1,5 +1,7 @@ +import logging import os import sys +import threading import time from collections import deque from datetime import datetime, timedelta @@ -7,6 +9,9 @@ from typing import Any, Dict, List, Optional, Tuple import cv2 import numpy as np +import redis + +logger = logging.getLogger(__name__) sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/config/__pycache__/config_models.cpython-310.pyc b/config/__pycache__/config_models.cpython-310.pyc index 89b46ac35e67eb8c9f89e46f0f3f01125c16b081..d9ff607c1ad0f8d698156a83de64ce95d2867dc9 100644 GIT binary patch delta 1679 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%0AxCHi70UpF@g@_C`+D{&89qOrGJgP*m3@q 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 diff --git a/config/__pycache__/settings.cpython-310.pyc b/config/__pycache__/settings.cpython-310.pyc index b3f9afda72eff4d1809863a41e50544c8f324095..a68d54ef0baa74bc4ced997adf7adae841e2f9f0 100644 GIT binary patch delta 2145 zcmZuyTWnNS6rFSDb?0?wI@5XdMW>}ahDS>&(3bLOp_Nwqz_vlXV6H>YZ96cXY0tea z7KlxFMEod8b3WvQD5D=@0709WsFnDmiHV6J{!RQWA~6Ui{#eks_nA^Kac<7K`?2;u z`<$7*=fT$VO-k11b6em;*Pc#Yh|MYGjxT;WckkNGhYRn_ zZ+2vhD)e39_uZbq~lcklm_R*gYV7RiCba z-3PJ)d;0TU*d=A^`?Hzh)X3y|I7z_}zkh!A-q)W%A-~@K;@-lg#oHhKa{2n*%eU^{ zxODf-Rj6mFq_&PG&6#AKp$|>6lsT>GQ+mcUYU$CulOEN^lji7>Uyzb@L&h~%7-A9w=(5PmlPU<6|!>714 zuMDRrjZrO?F?A=KN~U`geqQAZH^srtVhAM&)d)2Rr3h;f$`IBe;9>Lj;dC}>@^2hr zzG#aQFMndI`S3FD==l#C77kpG0SNA3bTT)%1JYVQkg4k7Kh-fSvv%~P0w;M z)pWH8DU?=I(CC_330Pj!C*s%Abt}cJr-|qI8~&qh#KXYB3b{7X&AAy=6_KQt)(K}p z+d}J6qg!X4u#sOd8tAqhZW|EVcDh4oMa$_LX%j|(Ke%jZE))xv&}qw+;+zGfFx?5W zt7Q_~aq+8*JYMwni~?h;Yp_FW-=`gH8|-A2;8O$3#;%^W1K{fFXH{qpFPr;220MBO zyZU;y_O{ms@}yDqFMD2T>(+Yu+B@>3K4D{V2zqXo;22Te{T=OH16pU_z#z)}^P*#9 zE3XRHctpdCHgDhugRP~aO|dyuH>T_^)Ykz9eml5{KM1x~iarwE^M8%g&AUT~NrYbw zRW&(`i8PFBhT})IGo7XkhVwzSjZK&)!~V{Dr&3hUYS1-$a*VZui6!`-Ax3n5#}*pG zsd@^Qfxmf4aubEP#UnqKWRw(mTwjvurzymQGK;A}ELngxu zKZ(o=gd+gQd13 z7x!JbVH`~iZ&ajaXE4>?yu1r$=ww>oL%?I;e~8T@+XFCBBr7a0Ecf#A!P^51-*SK` Ho?!A{V6Xu% delta 1504 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 afIvE-uV&CAGu9kFzdV0Ov*yT7+4g@3UdwL) delta 3654 zcmaJ^YitzP6`ngg`|{h^_=%Unc8u5f!J`l`j$5!Hk2+3l15THwyW^elddzxfxiiKX z);KLRty(!vbJC;WN}uQ4F}CA4 zMdI6Y&zyVCx#xASe>=zCO%+*%g?SSG`)J!~bLY5M?b6*BpN9dq6Uyb|k@A$`#C6TlMl{=qPiPq}WpKB+*W)bwP@ZBe z3YAJMsG^0BJCkry>0ui#|59OxBgo-Z1l0(x4^_E}V@?>nme#?zZln#zi2C?O5^6w* z zbqPqP>$44~1KNYoCcNE@ysPrEKdZ$9p34uzhrw?*)6raC*2)S~ymd*lN|bP!^mW0d z&_@BmQ{mNcL&ef(H?J#g+D_7%$aX&pe+YN8YADXD>Y!bVp2tFXp7=3i+7|Kg{MnA* zJ^d|6?SmtEm$xki+w~{YhQ@_YSDAMdVNrnaYB%ocgO>bvc8gt6TrLMvB!}-Ip4cHk z#41d+U^|*)4?|x(L)yf^e%0dDY++ z?3G_0%&QAOXR*PrvpHiYHyMtv{*z3@hfzUQ12+x!hlkz&n5 zQnU+<;tyB^c9iTY78ZowM^WzxoGf{dJqCMAJ6IJQE8WgEz{S$x2C6(aghk+(nUuZ4 zEwPhMIKEJ|uAH&YL0j1k_6+>Ftcvx+Kg(J>M9~hTM67@tx@pIgR%X;pxy)Ft<}eE7 z;7IwK?T3)!g#>E_xF~LB%;k1_8QRxxV~vnl|9Ird&)CEJ@WX5H>-B%>8zK=3z3bC- zohN9iAzWSTuTf&82-GE@Q@W+xNMRWoJf76j=@Bh?>>}K+xELXYZV*qF)VR*grA;bP zo8Ya=Dt2YzH?z^~b;HrjwA~-g^Qv2ook8ew-Krv76<=n;)d2KcuK zo+n5Uh?A{VqE)tIWfv9jM7=$c307!bvSTX3zw61A^4~8R7@HVNa$VzM?8B$P^{O&0jWUe++Kp33dwx9vVE_kdwxJ zAsoZnc&dk?-ZMoqWQ4DDHX(t zegQp%(tYc@hsfWT2vmfq%u9%V*`vMS^RuNs>t__DRQ^6Owa>+2joZNv)@OdoHQ?8k}%}0 zm_T++=GB-oHZMDvni*ft$18F^U9QFyP~ZtsPC>bLk{efYvPipA>ymXalnh%WfFRW zfVzM`N3fWdT}Z057GW$AEg){R_{cOm@h~Nc-U}gFmP4$7m1ClcSoy*qTOMJhG{)R8 zz1naFO=P(RYHN?_&2G|39n8h#q^@^;8EeW7o3@2*JfS(UV0Ll@=lB?(q_2K`aw2Pc zLuk3H7q79Okfzm@1n;-ju!C^7wO^qEgpyDb#M}D!iHRbHbAq;M2oGvU6sk&G0p6j_ z%n2N`G_-Nj;M{lyK5U!s7Fu?bXo7&Wd}_2J&n;iE9dA-k#k25!dwf?Xen-nflXw8F zHCz`@q5+>+qO0z6`_oiWf2h(%C~5_G`<%P7Q@SjUL#|MmUhObR}BES zl=A9*6GkTOQMj@7afr0nKz9G}&KF6iFh;j6Jti&N`2XkT*HQ8mgW8_$v%N@0qx=!l z(oOJrf-evpAP|?9(q|=)ajGRwZ!=y`K#wF*&29+GCu?wLn(rqby>PffFiwyr@Dqp! zr?_-a(voh?AwEYW9l}*cEGx|ev<8A75CjQI2<8cXMDSyRpA!6x;2MDl?b}3Mhk@R* zh)Se@Cy1hI;XMdn#{c$y_*(C-in@BGrnqQb$Y0^FP)f?hXWj_6dIz5+$rXuEX( zaz&Tf)0yOhzp&0RR4b!cK<4k@PqfjCp=gg_+DfJHxhjImn_%uh2m1=#JTSmqC_Y%r v0Ja?5*&|YrAWLNg!Ua;brXQiM2}_?$8{KGEvgr>cMGE=h^1*s}UCaLfBda*% diff --git a/core/__pycache__/result_reporter.cpython-310.pyc b/core/__pycache__/result_reporter.cpython-310.pyc index e153957d7519a4df80820c06d807b7e06a08fc02..254402e2e9e84474a17c95ab64a18fc91260a4a8 100644 GIT binary patch literal 11970 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 C5$4_i delta 1964 zcmaJ>T}&KR6rMXX`_tK7SXfGzWr2ml;R)H;&j=WZkO!NZ0^ol zNQkk)-#%EItD>ny=tHH(H0tV$ZLG$a_~L65$0uVY_Q{_oV^Z{-S^3!&-A%r^_nyD+ z+o?8N0XWt5=4;YdnERjV{b{Xzf&l(4-vLs@;A}Y3j z{`PllaN=F$=3J{4ier(?RbJ-Um>6=eNNa>}3V)J|xY={!GV|NMBL~>;whT+#uR0`~Wc3+U zGiW2bC;5k4QTGtQj5IwpEssr%j*d*3RgS;(Bp9wBjS~nD0*ptTw1NFm-XFDc7{c>m0MoALj7-ibVNH*K>=Jw0dz*Bz-io$n zw3^vxP(xOXg-mIZ^c0BK*iyv+X~}<4F+oU}d3_CbD^?5Z^-Z{TF=Q8gL2^C+f$s;> zgI7UE03sqSXyd^wLL6b28Ez8*U**5tzrsTV*)Nk;cFP|iEzIM zuIVFT%eVY*kEYAgl4IEgEpE?W2_#72hA8T`{I|hu%!r?@%=ZLEax4UD_=c#hBcPpW z%Nj8wJ0lso5lhKf9i`c%K`qR3b=MDv(7>Be4LPl*b-Ezuvay63;R`+uknXl+C+Y*F zH=nBihE(^V%ql3yxfs=wTEeQPKO!cw3Oh^yin z2hD`tD8SxE+Yoo1LKn{2R~-c{XgNOT248nyy0G#3=Rbe?{KjXmL7}npjlQQWUI#!p z<51MBLG=Y%4LjO^Fb!~x6p|}`HQEWH#|YGY02X$hCuPJ~MO7H8d+nF>(3|!UcpKU)Bmo36%iwTC!;CNVUk_g+k6Sj&cwn)?pars)Z@ikV zT7L^g+xDitFywYow^$?D9J_ko3oTZISVlY9p^7PCv%RzE znf4#5f|RAzSQ-k|0~}=!X%0rz7Jn_0N>fV--{UBjP5H?Zxw(yij)U EZ%+WUDF6Tf diff --git a/core/result_reporter.py b/core/result_reporter.py index e2d9ea0..210b7e0 100644 --- a/core/result_reporter.py +++ b/core/result_reporter.py @@ -235,6 +235,33 @@ class ResultReporter: else: raise Exception(f"MQTT 发布失败: {result[0]}") + def report_heartbeat( + self, + device_id: str, + status: Dict[str, Any] + ) -> bool: + """上报心跳""" + try: + heartbeat_data = { + "device_id": device_id, + "status": status, + "timestamp": datetime.now().isoformat(), + } + + topic = f"{self._topic_prefix}/heartbeat/{device_id}" + + if self._client and self._connected: + result = self._client.publish(topic, json.dumps(heartbeat_data, ensure_ascii=False)) + if result[0] == mqtt.MQTT_ERR_SUCCESS: + self._logger.debug(f"心跳上报成功: {device_id}") + return True + + self._logger.warning(f"心跳上报失败(MQTT未连接): {device_id}") + return False + except Exception as e: + self._logger.error(f"心跳上报异常: {e}") + return False + def get_pending_alerts(self) -> List[Dict[str, Any]]: """获取待同步的告警""" if self._local_cache: @@ -301,6 +328,14 @@ class ResultReporter: if self._client: self._client.loop_stop() self._client.disconnect() + + def close(self): + """关闭上报器(别名)""" + self.cleanup() + + if self._client: + self._client.loop_stop() + self._client.disconnect() self._logger.info("ResultReporter 清理完成") diff --git a/logs/main.log b/logs/main.log index 5b1be96..a8d0e1a 100644 --- a/logs/main.log +++ b/logs/main.log @@ -263,3 +263,120 @@ ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无 2026-01-30 09:27:08 | INFO | main | 收到信号 2, 正在停止服务... 2026-01-30 09:27:08 | INFO | main | 已停止所有视频流 2026-01-30 09:27:08 | INFO | main | 已停止所有视频流 +2026-01-30 15:08:51 | INFO | main | Edge_Inference_Service 初始化开始 +2026-01-30 15:08:51 | INFO | main | ================================================== +2026-01-30 15:08:51 | INFO | main | Edge_Inference_Service 启动 +2026-01-30 15:08:51 | INFO | main | ================================================== +2026-01-30 15:08:51 | INFO | main | 数据库初始化成功 +2026-01-30 15:08:55 | INFO | main | 配置管理器初始化成功 +2026-01-30 15:08:55 | INFO | main | 流管理器初始化成功 +2026-01-30 15:08:55 | INFO | main | 图像预处理器初始化完成: 输入尺寸 480x480, Batch大小 1-8, FP16模式 True +2026-01-30 15:08:55 | INFO | main | 预处理器初始化成功 +2026-01-30 15:08:55 | INFO | main | TensorRT引擎初始化配置: 模型=./models/yolo11n.engine, 输入尺寸=480x480, Batch=1, FP16=True +2026-01-30 15:08:56 | INFO | main | 连接事件: load - TensorRT -> ./models/yolo11n.engine +2026-01-30 15:08:56 | INFO | main | TensorRT引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:08:56 | INFO | main | 引擎已加载: default +2026-01-30 15:08:56 | INFO | main | 推理引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:08:56 | INFO | main | 后处理器初始化完成: NMS阈值=0.45, 置信度阈值=0.5 +2026-01-30 15:08:56 | INFO | main | 后处理器初始化成功 +2026-01-30 15:08:56 | INFO | main | 结果上报器初始化成功 +2026-01-30 15:08:56 | ERROR | main | 算法管理器初始化失败: name 'threading' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 124, in _init_algorithm_manager + self._algorithm_manager = AlgorithmManager() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 267, in __init__ + self._update_lock = threading.Lock() +NameError: name 'threading' is not defined +2026-01-30 15:08:56 | INFO | main | 所有组件初始化完成 +2026-01-30 15:08:56 | INFO | main | 已启动 0 个视频流 +2026-01-30 15:08:56 | INFO | main | Edge_Inference_Service 已启动 +2026-01-30 15:08:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:10:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:10:30 | INFO | main | 收到信号 2, 正在停止服务... +2026-01-30 15:10:30 | INFO | main | 已停止所有视频流 +2026-01-30 15:10:30 | INFO | main | 已停止所有视频流 +2026-01-30 15:10:30 | INFO | main | TensorRT引擎资源已释放 +2026-01-30 15:10:30 | INFO | main | 所有引擎已释放 +2026-01-30 15:11:55 | INFO | main | Edge_Inference_Service 初始化开始 +2026-01-30 15:11:55 | INFO | main | ================================================== +2026-01-30 15:11:55 | INFO | main | Edge_Inference_Service 启动 +2026-01-30 15:11:55 | INFO | main | ================================================== +2026-01-30 15:11:55 | INFO | main | 数据库初始化成功 +2026-01-30 15:11:59 | INFO | main | 配置管理器初始化成功 +2026-01-30 15:11:59 | INFO | main | 流管理器初始化成功 +2026-01-30 15:11:59 | INFO | main | 图像预处理器初始化完成: 输入尺寸 480x480, Batch大小 1-8, FP16模式 True +2026-01-30 15:11:59 | INFO | main | 预处理器初始化成功 +2026-01-30 15:11:59 | INFO | main | TensorRT引擎初始化配置: 模型=./models/yolo11n.engine, 输入尺寸=480x480, Batch=1, FP16=True +2026-01-30 15:11:59 | INFO | main | 连接事件: load - TensorRT -> ./models/yolo11n.engine +2026-01-30 15:11:59 | INFO | main | TensorRT引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:11:59 | INFO | main | 引擎已加载: default +2026-01-30 15:11:59 | INFO | main | 推理引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:11:59 | INFO | main | 后处理器初始化完成: NMS阈值=0.45, 置信度阈值=0.5 +2026-01-30 15:11:59 | INFO | main | 后处理器初始化成功 +2026-01-30 15:11:59 | INFO | main | 结果上报器初始化成功 +2026-01-30 15:11:59 | ERROR | main | 算法管理器初始化失败: name 'logger' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 293, in start_config_subscription + redis_client = redis.Redis( +NameError: name 'redis' is not defined + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 125, in _init_algorithm_manager + self._algorithm_manager.start_config_subscription() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 313, in start_config_subscription + logger.error(f"启动配置订阅失败: {e}") +NameError: name 'logger' is not defined +2026-01-30 15:11:59 | INFO | main | 所有组件初始化完成 +2026-01-30 15:11:59 | INFO | main | 已启动 0 个视频流 +2026-01-30 15:11:59 | INFO | main | Edge_Inference_Service 已启动 +2026-01-30 15:13:21 | INFO | main | 收到信号 2, 正在停止服务... +2026-01-30 15:13:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:13:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:13:21 | INFO | main | TensorRT引擎资源已释放 +2026-01-30 15:13:21 | INFO | main | 所有引擎已释放 +2026-01-30 15:14:04 | INFO | main | Edge_Inference_Service 初始化开始 +2026-01-30 15:14:04 | INFO | main | ================================================== +2026-01-30 15:14:04 | INFO | main | Edge_Inference_Service 启动 +2026-01-30 15:14:04 | INFO | main | ================================================== +2026-01-30 15:14:04 | INFO | main | 数据库初始化成功 +2026-01-30 15:14:08 | INFO | main | 配置管理器初始化成功 +2026-01-30 15:14:08 | INFO | main | 流管理器初始化成功 +2026-01-30 15:14:08 | INFO | main | 图像预处理器初始化完成: 输入尺寸 480x480, Batch大小 1-8, FP16模式 True +2026-01-30 15:14:08 | INFO | main | 预处理器初始化成功 +2026-01-30 15:14:08 | INFO | main | TensorRT引擎初始化配置: 模型=./models/yolo11n.engine, 输入尺寸=480x480, Batch=1, FP16=True +2026-01-30 15:14:08 | INFO | main | 连接事件: load - TensorRT -> ./models/yolo11n.engine +2026-01-30 15:14:08 | INFO | main | TensorRT引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:14:08 | INFO | main | 引擎已加载: default +2026-01-30 15:14:08 | INFO | main | 推理引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:14:08 | INFO | main | 后处理器初始化完成: NMS阈值=0.45, 置信度阈值=0.5 +2026-01-30 15:14:08 | INFO | main | 后处理器初始化成功 +2026-01-30 15:14:08 | INFO | main | 结果上报器初始化成功 +2026-01-30 15:14:12 | INFO | main | 算法管理器初始化成功 +2026-01-30 15:14:12 | INFO | main | 所有组件初始化完成 +2026-01-30 15:14:12 | INFO | main | 已启动 0 个视频流 +2026-01-30 15:14:12 | INFO | main | Edge_Inference_Service 已启动 +2026-01-30 15:14:21 | INFO | main | 收到信号 2, 正在停止服务... +2026-01-30 15:14:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:14:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:14:21 | INFO | main | TensorRT引擎资源已释放 +2026-01-30 15:14:21 | INFO | main | 所有引擎已释放 diff --git a/logs/main_error.log b/logs/main_error.log index 9b55ad8..bd1ed6c 100644 --- a/logs/main_error.log +++ b/logs/main_error.log @@ -159,3 +159,44 @@ Traceback (most recent call last): File "C:\Users\16337\miniconda3\envs\yolo\lib\socket.py", line 845, in create_connection sock.connect(sa) ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 +2026-01-30 15:08:56 | ERROR | main | 算法管理器初始化失败: name 'threading' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 124, in _init_algorithm_manager + self._algorithm_manager = AlgorithmManager() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 267, in __init__ + self._update_lock = threading.Lock() +NameError: name 'threading' is not defined +2026-01-30 15:08:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:10:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:11:59 | ERROR | main | 算法管理器初始化失败: name 'logger' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 293, in start_config_subscription + redis_client = redis.Redis( +NameError: name 'redis' is not defined + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 125, in _init_algorithm_manager + self._algorithm_manager.start_config_subscription() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 313, in start_config_subscription + logger.error(f"启动配置订阅失败: {e}") +NameError: name 'logger' is not defined