干货:三合一架构: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,全部是字符串,跨线程传递完全安全。


相关推荐
郑州光合科技余经理2 小时前
本地生活系统:多业务订单字段怎么分账本导出
java·开发语言·前端·数据库·uni-app·php·ai编程
怕浪猫9 小时前
FDE 如何正确解决现场项目工程性的问题
前端·后端·ai编程
Goboy11 小时前
多模态大模型已经能识别和描述视频,为什么仍然缺乏可靠的时序感知能力?
aigc·ai编程
烽火戏诸诸诸侯12 小时前
AI 让我的独门小工具焕发第二春
后端·ai编程·vibecoding
kyriewen13 小时前
Claude Code 的额度今天缩水了17%——官方公告上写的是"永久提高25%"
前端·ai编程·claude
程语AI15 小时前
RAG 分块策略实测:chunk\_size 和 overlap 怎么调,检索精度差多少
ai编程
ServBay15 小时前
xAI的 Grok Bot发布,AI 已经学会自己上班了
后端·ai编程·grok
zzjyr17 小时前
AI 问答的流式响应是怎么实现的?从 fetch 到 SSE 逐字解析
前端·人工智能·ai编程
挖掘狂人19 小时前
从 LLM 到 Agent Skill:9 个底层概念,一次理清整个 AI 技术栈
llm·agent·ai编程