干货:三合一架构:GUI/HTTP/引擎如何共用一条任务队列

GUI/HTTP/引擎如何共用一条任务队列

第一性原理:一个任务源只需要一个队列

做桌面工具,经常同时有两个入口需要处理任务:

  1. 前台 GUI 上用户点"开始处理"
  2. 后台 HTTP 接口收到文件上传请求

这两个入口如果各自开队列、各自管理引擎,不仅代码重复,还会让同一个进程里多线程抢占 IO,出很多莫名其妙的锁问题。

本质上,这俩都是任务生产者 ,真正干活的只有一个识别引擎。所以用第一性原理看问题:任务只有一个来源,那就只要一个队列。

代码实现

我们项目里就是这么做的:

python 复制代码
# main_window.py: 应用启动时只创建一次
self.queue = TaskQueue(maxsize=self.config.queue_maxsize)
# 引擎是单例
self.engine = Engine(self.config, self.bridge)
# 队列消费者绑定到引擎.process
if self.config.engine_auto_start:
    self.queue.start(self.engine.process)

GUI 入口提交任务(direct_page.py):

python 复制代码
folder = self.folder_edit.text().strip()
self.queue.submit({"p_FolderPath": folder})

HTTP 入口提交任务(http_server.py):

python 复制代码
# FastAPI 接收到上传,把任务推进同一个队列
item = {
    "p_FolderPath": temp_dir,
    "p_TaskId": task_id,
    "template": template,
}
if not queue.submit(item):
    return {"code": 503, "msg": "队列已满,请稍后重试"}

就这么简单。GUI 和 HTTP 都是生产者,引擎是唯一消费者。

好处

  • 一份代码,两处复用:不用给 GUI 写一套,HTTP 再写一套。
  • 天然流控:队列满了新任务直接拒绝,保护内存不爆。
  • 状态统一:引擎挂了就是挂了,不管从哪进来都进不去,不用两边同步状态。

关键约束

要做到这一点,任务必须是可序列化的纯字典,不能把 GUI 对象、Request 对象塞进去。我们这里任务就只带路径、参数、任务ID,全部是字符串,跨线程传递完全安全。


相关推荐
熊猫钓鱼>_>1 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 MVIKotlin 实现单向数据流适配
华为·ai编程·鸿蒙·openharmony·适配·数据流·mvkotlin
Alice-YUE1 小时前
前端 × AI:从 Cursor 到 Transformer,一份完整认知路径
前端·人工智能·transformer·ai编程·前端开发·cursor
FanetheDivine2 小时前
学习Agent开发 10.延迟工具 deferred tools
agent·ai编程
第十人i2 小时前
Pi 1.0 正式发布:原生 MCP + Pi Durable,终端编程代理的重大升级
ai编程·pi
树下困觉眯3 小时前
View绘制流程学习--获取WindowManager的三种方式
android·系统架构·view design
交付一线的ZLycan3 小时前
我用AI coding给旧手表(华米Amazfit GTR4)写了个番茄代办App
ai编程
晚安code3 小时前
Gemini 4 Argon 价格与用途:和 GPT-6、Claude 怎么选
ai编程
StrangeXin3 小时前
做AI项目,为什么我提议成立一个委员会
ai编程
Maynor9964 小时前
6张商品图→17秒带货短视频:开源12个Claude Skills,配音、字幕花字、BGM本地一条命令出片
ffmpeg·ai编程·claude·电商·agent skills