perf: 量化商品页打开耗时并去重检查 (#109)

This commit is contained in:
chengma
2026-08-10 17:40:44 +08:00
parent 4c9bf3865b
commit ba0706dc47
13 changed files with 693 additions and 72 deletions
+30 -8
View File
@@ -27,6 +27,7 @@ from .purchase_reconcile_service import (
PurchaseReconcileFactory,
PurchaseReconcileService,
)
from .performance_timing import TaskPerformanceTrace
from .task_models import (
NewClaimedTask,
OutboxEventRecord,
@@ -139,6 +140,9 @@ class TaskDispatcher:
cancelled: Callable[[], bool] = lambda: False,
device_connection_checker: Optional[Callable[[str], None]] = None,
task_saved: Callable[[str], None] = lambda _task_id: None,
performance_trace_factory: Callable[[], TaskPerformanceTrace] = (
TaskPerformanceTrace
),
) -> None:
self._gateway = gateway
self._repository = repository
@@ -153,6 +157,7 @@ class TaskDispatcher:
self._reconcile_factory = purchase_reconcile_factory
self._cancelled = cancelled
self._task_saved = task_saved
self._performance_trace_factory = performance_trace_factory
self._device_connection_checker = (
device_connection_checker
or AndroidDeviceService().require_connected
@@ -193,6 +198,15 @@ class TaskDispatcher:
def execute_one(self) -> TaskDispatchOutcome:
"""不可逆采购优先核单,其余按 Outbox、本地任务、Admin 顺序处理。"""
trace = self._performance_trace_factory()
with trace.activate():
return self._execute_one_traced(trace)
def _execute_one_traced(
self, trace: TaskPerformanceTrace
) -> TaskDispatchOutcome:
"""在同一任务计时上下文中串行处理一轮任务。"""
unresolved_reader = getattr(
self._repository, "unresolved_irreversible_purchase", None
)
@@ -211,7 +225,9 @@ class TaskDispatcher:
raise AndroidDeviceSearchError(
"存在只允许核对的采购任务;请先连接并保存原 Android 设备"
)
self._device_connection_checker(self._device_address)
trace.bind_task(reconcile_task.remote_task_id)
with trace.stage("adb_device_check"):
self._device_connection_checker(self._device_address)
if self._reconcile_factory is None:
raise RuntimeError(
f"任务 {reconcile_task.remote_task_id} 只允许核对订单,"
@@ -234,7 +250,8 @@ class TaskDispatcher:
raise AndroidDeviceSearchError(
"请先在设置页选择并保存 Android 设备"
)
self._device_connection_checker(self._device_address)
with trace.stage("adb_device_check"):
self._device_connection_checker(self._device_address)
if not self.purchase_ready:
pending_purchase = self._repository.next_purchase_task()
@@ -248,16 +265,19 @@ class TaskDispatcher:
include_purchase=self.purchase_ready
)
if task is None:
remote = self._gateway.claim_next(
self._client, self.claim_capabilities()
)
with trace.stage("admin_claim_request"):
remote = self._gateway.claim_next(
self._client, self.claim_capabilities()
)
if remote is None:
return TaskDispatchOutcome("no_task", "暂无可领取的任务")
trace.bind_task(remote.task_id)
saved_now = False
try:
self._repository.add_claimed_task(
admin_task_to_new_claimed_task(remote)
)
with trace.stage("sqlite_local_save"):
self._repository.add_claimed_task(
admin_task_to_new_claimed_task(remote)
)
saved_now = True
except DuplicateTaskError:
pass
@@ -273,6 +293,8 @@ class TaskDispatcher:
if saved_now:
self._task_saved(remote.task_id)
trace.bind_task(task.remote_task_id)
if task.task_type is TaskType.COLLECT:
service = CollectTaskService(
self._gateway,