From 7ef9763a50a7fe0031cdf3822c5558fc8ea234f4 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 27 May 2026 14:14:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(cd):=20out=5Fservice/cd.py=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BB=BB=E6=84=8F=20host:port,=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=20IP=20=E7=99=BD=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit socket 槽位和 per-host 锁改为首次访问时懒注册, 用 double-checked locking 保证热路径无竞争。不再硬编码 4 个采集器地址。 Co-Authored-By: Claude Opus 4.7 (1M context) --- out_service/cd.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/out_service/cd.py b/out_service/cd.py index 567eaab4..19d18d41 100644 --- a/out_service/cd.py +++ b/out_service/cd.py @@ -4,14 +4,21 @@ from urllib.parse import urlparse, parse_qs import socket import threading -sc_all = { - "192.168.1.220_6000": None, - "192.168.1.235_6000": None, - "192.168.1.225_6000": None, - "192.168.1.230_6000": None, -} +sc_all = {} +sc_locks = {} +registry_lock = threading.Lock() -sc_locks = {addr: threading.Lock() for addr in sc_all} + +def get_lock(addr): + lock = sc_locks.get(addr) + if lock is None: + with registry_lock: + lock = sc_locks.get(addr) + if lock is None: + lock = threading.Lock() + sc_locks[addr] = lock + sc_all.setdefault(addr, None) + return lock def get_checksum(body_msg): return sum(body_msg) & 0xFF @@ -106,13 +113,10 @@ class JSONRequestHandler(BaseHTTPRequestHandler): host = query_params.get('host', ['127.0.0.1'])[0] port = query_params.get('port', ['6000'])[0] addr = f'{host}_{port}' - - if addr not in sc_all: - self.error(f'{addr} 未找到') - return + lock = get_lock(addr) def request_once(): - with sc_locks[addr]: + with lock: sc = sc_all[addr] try: if sc is None: