#!/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)