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


相关推荐
Younglina3 小时前
三个晚上,我和 WorkBuddy 做了个生图网站
前端·后端·ai编程
不老刘4 小时前
异构双 Agent 协同:构建无人值守的长任务自动化研发流水线
运维·人工智能·自动化·ai编程·1024程序员节
技术小甜甜4 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
金銀銅鐵4 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
Bigger4 小时前
PR 没被合并,我把 Tauri 版自己做出来了:安装包从 100MB 砍到 33MB
开源·ai编程·掘金社区
ZzT5 小时前
Claude Code 用量去哪了:实测 7 天 4423 次请求,六成花在重读对话上
ai编程·claude
Solara6 小时前
进推荐流的文章不是快 1.42 倍,是 3.36 倍:我把错的数写进了长期记忆
人工智能·程序员·ai编程
黄俊懿7 小时前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
frcoder7 小时前
TackHarness打造属于自己的编程工作流
agent·ai编程·1024程序员节·研发·harness