- 闭环修复:审批 task_id 显式化(N2)、通知回退路径门闸 finally 释放(N1)、 personalization 原子写(S10,公共 atomic_write_json) - server.tasks 拆解:__init__ 轻量化、Blueprint/路由移至 blueprint.py/web.py, app_legacy 装配点惰性挂载;models.py 循环依赖死导入移除 - 执行链 Web 解耦:emit_event/run_background 安全包装(socketio 未绑定静默), 清除 4 处裸 socketio.emit(含 task_stopped 先写事件流再推送的顺序修复) - RuntimeService 补建对话下沉:chat 任务无 conversation_id 时服务层装配, 客户端无需复制 Web 两步流程 - 事件协议:get_task_events 返回 meta.window_start 缺口检测水位 - 验收:test_runtime_standalone_lifecycle 子进程隔离(config import 固化问题), 独立启动 + 协议全链路 + 审批语义全绿;全量 74 测试失败恰为 4 项存量
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""Flask/SocketIO 扩展实例。"""
|
||
import threading
|
||
|
||
from flask_socketio import SocketIO
|
||
|
||
# 统一的 SocketIO 实例,使用线程模式以兼容现有逻辑
|
||
socketio = SocketIO(cors_allowed_origins="*", async_mode='threading', logger=False, engineio_logger=False)
|
||
|
||
|
||
def emit_event(event, data, room=None, **kwargs):
|
||
"""Web 模式下经 socketio 实时推送;独立 Gateway 进程(socketio 未绑定 app)静默跳过。
|
||
|
||
事件的权威记录是任务事件流(TaskRecord.events,_append_event 落盘在前);
|
||
socket 推送只是在线客户端的实时增量通道——独立进程没有 socket 客户端,
|
||
跳过不丢数据。Web 模式下推送失败也静默(对齐原各调用点的 try/except 语义)。
|
||
"""
|
||
if socketio.server is None:
|
||
return
|
||
try:
|
||
socketio.emit(event, data, room=room, **kwargs)
|
||
except Exception:
|
||
pass
|
||
|
||
|
||
def run_background(fn, *args, **kwargs):
|
||
"""启动后台任务:Web 模式走 socketio.start_background_task(兼容其线程模型);
|
||
独立 Gateway 进程(socketio 未初始化)降级为 daemon 线程。"""
|
||
if socketio.server is not None:
|
||
return socketio.start_background_task(fn, *args, **kwargs)
|
||
t = threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True)
|
||
t.start()
|
||
return t
|
||
|
||
|
||
__all__ = ["socketio", "emit_event", "run_background"]
|