perf: 量化商品页打开耗时并去重检查 (#109)
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user