阶段3: 摘除 STF——删除 stf_client/stf_device_mgmt 与全部引用(STF 容器重启/设备管理/强制释放占用/agent 按钮/占用列),调度与设备管理完全基于本地设备池+adb;错误类迁入 device_worker,create_worker 去 stf 参数

This commit is contained in:
2026-08-18 08:08:32 +08:00
parent 98244d8161
commit a5ce57b6fd
17 changed files with 71 additions and 956 deletions
+19 -9
View File
@@ -18,12 +18,23 @@ import uiautomator2 as u2
from config import USB_ADB_HOST, USB_ADB_PORT
from core.logger import get_logger
from core.stf_client import DeviceOfflineError, STFError
from core import device_pool
from .adb_helper import adb_connect, _adb_remote
_log = get_logger("core.worker")
class STFError(Exception):
"""设备操作错误(历史名称保留兼容)。code: offline/conflict/..."""
def __init__(self, message, code=""):
super().__init__(message)
self.code = code
class DeviceOfflineError(STFError):
"""设备离线/不可用:任务不重试(换设备也没用)。"""
# 心跳超时阈值(秒)。worker 超过这个时间没更新心跳,判定为卡死
_HEARTBEAT_TIMEOUT = 120
# 看门狗检查间隔
@@ -201,11 +212,11 @@ def stop_watchdog():
class BaseWorker(threading.Thread):
"""通用 worker 基类。
自动处理:STF 占用/释放、u2 连接、状态上报、异常捕获、stop 信号、心跳。
自动处理:设备获取、u2 连接、状态上报、异常捕获、stop 信号、心跳。
子类只需实现 run_task(d) 方法,专注业务逻辑。
生命周期(基类 run() 已封装,不要重写):
1. acquire 设备(STF 占用 + adb 连接)
1. acquire 设备(直连 IP:5555 / USB 走远程 adb server)
2. u2.connect 拿到 d
3. 调用 setup(d) ← 子类可选钩子,做初始化
4. 调用子类 run_task(d) ← 业务逻辑
@@ -246,9 +257,8 @@ class BaseWorker(threading.Thread):
其他异常 — 可重试
"""
def __init__(self, stf_client, serial, params=None, daemon=True):
def __init__(self, serial, params=None, daemon=True):
super().__init__(daemon=daemon)
self.stf = stf_client
self.serial = serial
self.params = params or {}
self._stop_flag = threading.Event()
@@ -347,7 +357,7 @@ class BaseWorker(threading.Thread):
def run(self):
"""基类主循环:不要重写。子类实现 run_task + 可选钩子。"""
device = STFDevice(serial=self.serial)
_update_status(self.serial, status="connecting", stf_occupied=False,
_update_status(self.serial, status="connecting",
last_error="", remote_adb_url="", usb_server="", model="",
current_action="")
try:
@@ -370,7 +380,7 @@ class BaseWorker(threading.Thread):
model = info.get("productName") or ""
except Exception:
pass
_update_status(self.serial, status="running", stf_occupied=True,
_update_status(self.serial, status="running",
remote_adb_url=remote or "", usb_server=usb_server or "",
model=model)
@@ -425,9 +435,9 @@ class BaseWorker(threading.Thread):
with _WORKERS_LOCK:
cur = _WORKERS.get(self.serial, {}).get("status")
if cur in ("running", "connecting"):
_update_status(self.serial, stf_occupied=False, status="released")
_update_status(self.serial, status="released")
else:
_update_status(self.serial, stf_occupied=False)
pass
def _u2_connect_with_timeout(self, remote):
"""u2.connect 带超时保护,避免 atx-agent 无响应时永久 hang。"""