异步运算任务规划
异步高性能运算与异步请求的整体方案、阶段拆分与验收标准。
异步高性能运算与异步请求任务规划
目标
- 保持 Qt 主线程只负责 UI、状态提交、轻量事件调度。
- 将重运算统一迁移为“快照采集 -> 后台计算 -> 主线程应用”模型。
- 将下载 / HTTP / 子进程探测统一迁移为“任务槽 + 线程池/进程池”模型。
- 避免在 FRAME/TICK 订阅链路中直接执行重计算、阻塞 I/O 或重复系统调用。
总原则
- QWidget/QPixmap/QPainter/QtMultimedia 主调用必须留在主线程。
- 后台任务只处理纯数据,不直接操作 Qt 对象。
- 高频任务必须 single-flight,不允许队列堆积。
- 下载/搜索/探测类请求优先 io_pool。
- numpy/cv2/可释放 GIL 的高频计算优先 vector_pool。
- 纯 Python 重 CPU 运算优先进程池或受控线程池。
已完成
1. ComputeHub 基础设施
- 已新增 io_pool / vector_pool / cpu_pool。
- 已提供 submit_latest single-flight 语义。
2. 音频频响采样
- AudioMeter 已改为后台缓存采样,主线程只读缓存。
3. 雪球碰撞
- 已统一接入 ComputeHub vector single-flight。
4. 物理世界 PhysicsWorld
- 已改为快照 -> 后台步进 -> 主线程应用。
5. 粒子系统
- 已改为后台 update + 主线程绘制。
- 已修复高并发粒子申请丢失问题。
- 已增加帧边界批量收口,降低主线程事件风暴。
6. UI / 服务链路已收口项
- SpeakerSearchDialog 搜索已接入 io_pool latest-only。
- OllamaBootstrap 的预启动 / CLI 刷新 / ping 已接入 io_pool latest-only。
- CloudMusic 本地音乐扫描 / 喜欢列表加载已接入 io_pool latest-only。
- CloudMusic 播放准备 / 下载 / 监控 / seek 校对已接入 ComputeHub。
- OllamaSession 的 pull / chat / ping 已接入 io_pool。
- UpdateManager 已增加信息去重与进度节流。
- UpdateDialog / CmdCenter / ToolDispatcher 的裸线程入口已收口到 io_pool。
- GSVMove 预热入口与 YuanBao 登录监控已改为池化调度。
- MicrophoneSTT 启动自举线程已接入 io_pool,识别工作线程保留。
- AI 设置面板的元宝登录启停入口已接入 io_pool。
- CMDWindow 的流式命令入口已接入 io_pool。
- CloudMusicManager 初始化登录入口已接入 io_pool。
- 拉海洛方块 runtime 的 BGM 搜索/自动播放已改为异步,并增加打开代次保护。
- CloudMusic 开始播放时的时长探测已改为后台缓存,不再在主线程同步探测音频时长。
- CloudMusic 登录链的二维码登录/退出登录入口已接入 io_pool,`_safe_login_call` 已改为线程池超时等待。
- TimingManager 已为 FRAME 事件补充 `tick_alpha` / `dt_ms` / `timestamp`。
- PhysicsWorld 已改为 TICK 步进、FRAME 插值;物理挂件窗口已切到 `render_x/render_y`。
- ParticleOverlay 已改为 TICK 更新、FRAME 插值绘制。
- CloudMusic 的粒子生成/seek 校对已从 FRAME 迁到 TICK,音符粒子间隔已按旧 frame 语义换算为 tick。
- ProgressPanel 已拆为 FRAME 跟随位置、TICK 请求进度。
- practical 粒子脚本已增加统一的 frame->tick 速率换算,速度/重力/drag/寿命衰减已按旧 60fps 语义补偿。
待搬任务清单
P0:高收益、低风险,优先继续
1. lib/script/cloudmusic/_mixin_playback.py
- 事件链路:
- FRAME -> seek 校对线程
- _play_current -> 播放准备线程
- _download_and_play -> 下载线程
- _do_play_file -> 播放监控线程
- 目标:
- seek 校对改为 ComputeHub single-flight。
- 播放准备/下载前置请求收口到 io_pool。
- 保留 Qt 主线程播放与必要取消令牌语义。
2. lib/script/chat/ollama_session.py
- 事件链路:
- 模型自动 pull
- stream_chat 后台线程
- pull 完成后再次 ping
- 目标:
- 改接 io_pool。
- ping 统一复用 single-flight 槽位。
3. lib/script/update_manager.py
- 事件链路:
- GitHub release 检查
- ZIP 下载
- 解压
- 覆盖复制
- Git 子进程调用
- 目标:
- 下载/解压/复制分层接入 io_pool。
- 大量 progress 回调加节流,减少 UI 频繁刷新。
P1:网络/子进程类热点
4. lib/script/yuanbao_free_api/service.py
- 事件链路:
- 本地服务探活 urlopen
- 端口占用 netstat/taskkill
- ZIP 解包与目录扫描
- 登录监控线程
- 目标:
- 统一接入 io_pool。
- 端口探测和解包流程去手工线程化。
5. lib/script/gsvmove/service.py
- 事件链路:
- 预热线程
- 目录扫描
- 子进程启动/探测
- 目标:
- 统一任务槽。
- 将目录扫描与探测从主事件链彻底隔离。
6. lib/script/microphone_stt/service.py
- 事件链路:
- model bootstrap
- worker 启停
- 目标:
- bootstrap / 模型发现 / 初始化改为 io/cpu 分离。
P2:图像/资源处理类
7. lib/script/SEanima/frame_cache.py
- 事件链路:
- 预取线程
- PIL 打开帧图
- 目标:
- 改为 vector/io_pool 任务。
- 减少 burst 预取时的线程散射。
8. lib/core/qt_gif_loader.py / lib/script/obj-雪豹/manager.py
- 事件链路:
- GIF / 图像同步打开
- 目标:
- 解析与尺寸探测后台化。
9. lib/script/cloudmusic/_mixin_login.py
- 事件链路:
- 二维码图像解码
- OpenCV 检测
- 登录探测线程
- 目标:
- cv2/numpy 部分统一 vector_pool。
P2.5:时序模型收敛(tick 更新 / frame 表现)
10. 剩余 FRAME 驱动的状态更新链
- 目标文件:
- lib/script/cloudmusic/manager.py
- lib/script/obj-摩托/manager.py
- lib/script/ui/auto_chat_button.py
- lib/script/ui/chat_mode_button.py
- lib/script/ui/clickthrough_button.py
- lib/script/ui/close_button.py
- lib/script/ui/command_dialog.py
- lib/script/ui/command_hint_box.py
- lib/script/ui/launch_wuwa_button.py
- lib/script/ui/mic_stt_indicator.py
- lib/script/ui/more_functions_button.py
- lib/script/ui/playlist_panel.py
- lib/script/ui/progress_panel.py
- lib/script/ui/restore_button.py
- lib/script/ui/scale_button.py
- lib/script/ui/speaker_search_dialog.py
- 目标:
- 业务状态更新迁移到 TICK。
- FRAME 仅保留插值、跟手动画、纯绘制刷新。
- 高频 UI 闪烁/位移动画优先做 alpha 或 position 插值,不在 FRAME 中改业务状态。
P3:辅助链路和零散裸线程
11. lib/core/cmd_center.py
12. lib/script/tool_dispatcher/dispatcher.py
13. lib/script/ui/ai_settings_panel.py 中元宝启停线程
14. lib/script/ui/update_dialog.py 与 update_manager 的接口对齐
执行顺序
1. 继续收口 CloudMusic 播放链。
2. 收口 OllamaSession 的 pull / chat / ping 调度。
3. 收口 UpdateManager 的下载/解压/复制链。
4. 收口 YuanBao-Free-API 与 GSVMove。
5. 收口图像预取/解码链。
验收标准
- 主线程中不再出现高频重复 COM/系统调用。
- 同一入口重复触发时不再堆积裸线程。
- 高频任务旧结果自动丢弃或合并。
- 网络/下载链路能被统一取消、复用、观测。
- 先通过静态编译,再做运行态帧耗时观察。