57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import time
|
|
|
|
from services.runtime import get_logger, get_socketio
|
|
from services.state import safe_get_account, safe_iter_task_status_items
|
|
|
|
|
|
def status_push_worker() -> None:
|
|
"""后台线程:按间隔推送运行中任务的状态更新(可节流)。"""
|
|
logger = get_logger()
|
|
try:
|
|
push_interval = float(os.environ.get("STATUS_PUSH_INTERVAL_SECONDS", "2"))
|
|
except Exception:
|
|
push_interval = 2.0
|
|
push_interval = max(0.5, push_interval)
|
|
|
|
socketio = get_socketio()
|
|
|
|
while True:
|
|
try:
|
|
status_items = safe_iter_task_status_items()
|
|
for account_id, status_info in status_items:
|
|
if status_info.get("status") != "运行中":
|
|
continue
|
|
user_id = status_info.get("user_id")
|
|
if not user_id:
|
|
continue
|
|
account = safe_get_account(user_id, account_id)
|
|
if not account:
|
|
continue
|
|
account_data = account.to_dict()
|
|
socketio.emit("account_update", account_data, room=f"user_{user_id}")
|
|
|
|
progress = status_info.get("progress", {}) or {}
|
|
progress_data = {
|
|
"account_id": account_id,
|
|
"stage": status_info.get("detail_status", ""),
|
|
"total_items": account.total_items,
|
|
"browsed_items": progress.get("items", 0),
|
|
"total_attachments": account.total_attachments,
|
|
"viewed_attachments": progress.get("attachments", 0),
|
|
"start_time": status_info.get("start_time", 0),
|
|
"elapsed_seconds": account_data.get("elapsed_seconds", 0),
|
|
"elapsed_display": account_data.get("elapsed_display", ""),
|
|
}
|
|
socketio.emit("task_progress", progress_data, room=f"user_{user_id}")
|
|
|
|
time.sleep(push_interval)
|
|
except Exception as e:
|
|
logger.debug(f"状态推送出错: {e}")
|
|
time.sleep(push_interval)
|
|
|