FastMCP 高级特性之Background Tasks:用 TaskConfig 与 Docket 搭建可复现的后台任务骨架
1. 为什么你的 MCP 工具一跑长任务就“卡死”如果你用 FastMCP 写过工具大概率遇到过这种场景一个工具函数里要跑数据清洗、批量文件解析或者调用外部模型做推理耗时从几十秒到几分钟不等。客户端一发请求整个会话就挂在那里等界面转圈用户以为服务挂了其实只是你的函数还在await asyncio.sleep()。MCP 协议里工具、资源、提示这些组件的交互默认都是阻塞式的。客户端发请求服务端算完才回响应。对于秒级以内的操作这没问题但一旦进入“分钟级”区间体验就崩了。MCP 后台任务协议SEP-1686就是来解决这个问题的客户端发起操作后立刻拿到一个任务 ID然后可以轮询进度、等结果就绪再取。FastMCP 把这套协议封装得很薄核心动作只有一个——在装饰器里加taskTrue。但真正要把它用稳光加个布尔值不够。你需要理解TaskConfig的三种执行模式、Docket后端的选择、轮询间隔的取舍以及怎么验证后台执行确实生效了。这篇就按“能复制、能跑通、能排错”的路线把 TaskConfig 与 Docket 的骨架搭出来。适合谁看已经在用 FastMCP 写工具、准备把耗时逻辑挪到后台的开发者或者刚接触 MCP 后台任务、想先跑通一个最小可复现示例的人。下面所有代码都可以直接贴进项目里改。2. TaoToken 在后台任务链路里的接入位置后台任务跑起来之后你的工具函数里大概率要调用模型能力——比如批量摘要、分类、生成报告。这时候如果每个任务都自己去管理 API Key、切换通道、处理限流后台任务反而变成了新的复杂度来源。我的做法是把模型调用统一走 TaoToken 的 API 通道。它提供统一的 Key 和 API 入口后台任务里只需要拿一个 Key就能调用不同模型不用在任务代码里散落多套鉴权逻辑。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。具体接入位置在你的 FastMCP 工具函数内部当任务进入“需要模型推理”那一步时用统一的 base_url 和 Key 发起请求。这样后台任务的重试、超时、并发控制都集中在 Docket 层模型调用层保持干净。如果你还没拿 Key可以先到控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 然后在 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。注意后台任务里调用外部 API 时务必设置合理的超时和重试。Docket 本身支持重试策略但模型调用层的超时要单独配否则一个卡住的请求会占住 worker 槽位。3. 可复制的 TaskConfig 配置与 Docket 接入骨架3.1 最小可跑的服务端先装依赖FastMCP 的任务系统由 Docket 提供支持Docket 最初由 Prefect 开发用于支撑每天数百万并发任务的调度服务现在已经开源。安装时直接装 fastmcp 即可Docket 会作为依赖进来。pip install fastmcp服务端代码我把它拆成“工具定义”和“任务配置”两部分方便你对照改import asyncio from datetime import timedelta from fastmcp import FastMCP from fastmcp.server.tasks import TaskConfig mcp FastMCP(MyServer, tasksTrue) mcp.tool(taskTaskConfig(modeoptional, poll_intervaltimedelta(seconds2))) async def slow_computation(duration: int) - str: 模拟一个耗时操作每秒推进一步。 for i in range(duration): await asyncio.sleep(1) return fCompleted in {duration} seconds mcp.tool(taskTaskConfig(moderequired)) async def must_be_background() - str: 必须以后台方式执行客户端不带 task 参数会报错。 await asyncio.sleep(3) return Only runs as a background task mcp.tool(taskTaskConfig(modeforbidden)) async def sync_only() - str: 不支持后台执行永远同步返回。 return Never runs as background task这里三个工具分别对应三种模式。optional是taskTrue的等价写法客户端带 task 参数就走后台不带就同步required强制后台客户端不带 task 直接报错forbidden是默认行为不支持后台。3.2 TaskConfig 参数对照参数作用常用值mode执行模式optional / required / forbiddenpoll_interval建议客户端轮询间隔timedelta(seconds2) 到 30taskTrue布尔快捷方式等价于 modeoptionaltaskFalse布尔快捷方式等价于 modeforbidden轮询间隔的取舍很直接短间隔反馈快但服务器负载高长间隔负载低但状态更新延迟。我一般给秒级任务配 2 秒分钟级任务配 10 到 30 秒。3.3 Docket 后端配置默认走内存后端memory://零配置但重启丢任务、不支持水平扩展。生产环境换成 Redisexport FASTMCP_DOCKET_URLredis://localhost:6379如果要加 worker 做水平扩展用 CLIexport FASTMCP_DOCKET_CONCURRENCY20 fastmcp tasks worker server.py每个额外 worker 从同一个队列取任务。注意额外 worker 只在 Redis/Valkey 后端下有效内存后端只能单进程。3.4 进度上报与 Docket 依赖注入后台任务最怕“黑盒”用户不知道跑到哪了。FastMCP 提供Progress依赖注入后可以上报进度from fastmcp import FastMCP from fastmcp.dependencies import Progress, CurrentDocket, CurrentWorker from docket import Docket, Worker mcp FastMCP(MyServer) mcp.tool(taskTrue) async def process_files( files: list[str], progress: Progress Progress(), docket: Docket CurrentDocket(), worker: Worker CurrentWorker(), ) - str: await progress.set_total(len(files)) for f in files: await progress.set_message(fProcessing {f}) await asyncio.sleep(0.5) await progress.increment() return fProcessed {len(files)} files on {worker.name}CurrentDocket()让你能在任务里再调度其他后台任务把工作串联起来CurrentWorker()拿到 worker 元信息。进度 API 就三个set_total、increment、set_message即时执行和后台执行下都能用。4. 验证后台执行是否生效一次触发 日志回读4.1 客户端触发服务端起在 8000 端口后用客户端触发一次后台任务import asyncio from fastmcp import FastMCPClient async def main(): client FastMCPClient( server_addresshttp://localhost:8000, server_nameMyServer, ) try: resp await client.call_tool( tool_nameslow_computation, arguments{duration: 5}, task{enabled: True}, ) task_id resp.task_id print(f后台任务已启动任务 ID: {task_id}) while True: status await client.get_task_status(task_id) print(f当前状态: {status.status}) if status.status completed: print(f结果: {status.result}) break elif status.status failed: print(f失败: {status.error}) break await asyncio.sleep(1) finally: await client.close() if __name__ __main__: asyncio.run(main())4.2 成功结果长什么样跑通后你会看到类似输出后台任务已启动任务 ID: task_abc123 当前状态: running 当前状态: running 当前状态: completed 结果: Completed in 5 seconds关键验证点有两个一是call_tool立刻返回了 task_id没有等 5 秒二是轮询过程中状态从 running 变到 completed。如果call_tool卡了 5 秒才返回说明后台没生效检查装饰器是不是漏了taskTrue或者 mode 配成了 forbidden。4.3 日志回读服务端启动时加上日志级别能看到 worker 取任务的记录FASTMCP_LOG_LEVELDEBUG fastmcp run server.py日志里会出现 worker 从队列取任务、执行、写回结果的条目。如果用的是 Redis 后端还可以直接查队列长度确认任务有没有被消费。5. 本篇常见错排查报错一ValueError: taskTrue requires an async function后台任务必须用异步函数。把def改成async def同步函数加taskTrue会在注册时直接抛错。报错二客户端带 task 参数调用 required 工具却报“task required”检查客户端是不是漏传了task{enabled: True}。moderequired的工具客户端不带 task 参数会直接返回错误这是设计行为。报错三内存后端下加了 worker 但任务没被分担内存后端只支持单进程额外 worker 不生效。换FASTMCP_DOCKET_URLredis://localhost:6379再试。报错四服务器重启后未完成任务全丢了这是内存后端的特性任务不持久化。生产环境必须换 Redis/Valkey。报错五进度一直不更新检查Progress是不是作为带默认值的参数注入的写成progress: Progress Progress()不要手动实例化传进去。报错六tasksTrue全局开启后同步工具报错全局开启后同步工具需要显式设taskFalse来覆盖否则注册时报错。6. 把模型调用接进后台任务后台任务骨架跑通后下一步就是把实际的模型调用塞进工具函数。我的建议是任务调度、重试、超时交给 Docket模型调用统一走 TaoToken 的 API 通道。这样你的工具函数里只需要关心业务逻辑鉴权和通道切换不散落在任务代码里。如果你要长期跑编码类或 Agent 类任务可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。想先验证模型对话效果用模型对话入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite ClaudeCode 相关配置参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。一个实用技巧在后台任务里调用模型时把 Docket 的重试和模型调用的超时分开配。Docket 负责“任务级重试”模型调用层负责“单次请求超时”。两者混在一起排查问题时很难定位是任务调度挂了还是 API 请求卡了。

相关新闻

广州帅兵科技 × 任夏《月亮替我望故乡》:一次由歌迷发起的音乐专辑U盘制作全案设计

广州帅兵科技 × 任夏《月亮替我望故乡》:一次由歌迷发起的音乐专辑U盘制作全案设计

喜欢一首歌的时候,总想为它做点什么。 这段时间我一直在循环任夏老师的《月亮替我望故乡》,越听越觉得 —— 这么好的歌,值得一套配得上它的实体专辑。我是广州帅兵科技的一员,我们公司专门做音乐 U 盘专辑策划与定制。 于是我们没…

2026/9/28 18:43:44 阅读更多 →
QGraphicsItem 鼠标样式污染 QGraphicsView?用 TaoToken 统一 Key 排查配置骨架

QGraphicsItem 鼠标样式污染 QGraphicsView?用 TaoToken 统一 Key 排查配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 18:43:44 阅读更多 →
RWKV7-G0b 13.3B 发布:RNN 的新一步,TaoToken 统一 Key 接入配置实战

RWKV7-G0b 13.3B 发布:RNN 的新一步,TaoToken 统一 Key 接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 18:43:44 阅读更多 →

最新新闻

W4 实习生大模型周总结:从 RAG 混合召回到多轮长记忆中枢与 SQL AST 审计全景工程实战

W4 实习生大模型周总结:从 RAG 混合召回到多轮长记忆中枢与 SQL AST 审计全景工程实战

在过去这一周(W4)的大模型工程落地与高可用研发中,我们完成了从“单一 Prompt 交互”到“支撑复杂企业级严肃业务的AI 工程化纵深防御体系(Full-Stack LLM Engineering System)”的全面闭环! 在很多初级 AI…

2026/9/28 19:31:01 阅读更多 →
聚宽米筐优矿掘金对比:Python批量参数实验怎样选平台

聚宽米筐优矿掘金对比:Python批量参数实验怎样选平台

做Python批量参数实验,可以比较聚宽、米筐、优矿和掘金量化。四个平台的选择重点不在谁一次跑得更快,而在参数组合、运行环境、失败记录和结果摘要能否稳定保存。想在网页中集中研究,可先比较聚宽、米筐与优矿;希望同时观察开发、…

2026/9/28 19:31:01 阅读更多 →
SPI总线实战:从时序模式到多从机调试的RT-Thread实践

SPI总线实战:从时序模式到多从机调试的RT-Thread实践

做嵌入式工控的人,几乎都有被SPI“上一课”的经历。我前几天调试一块基于GD32H759的采集板,Flash读写一切正常,换到挂在同一条总线上的磁编码器时,数据突然开始乱跳,排查到最后才发现是片选时序和模式配置交叉踩坑。这…

2026/9/28 19:31:01 阅读更多 →
treg 密钥优先(own-key always wins)规则详解:4 种方式降低 API 调用成本(完整指南)

treg 密钥优先(own-key always wins)规则详解:4 种方式降低 API 调用成本(完整指南)

treg 密钥优先(own-key always wins)规则详解:4 种方式降低 API 调用成本(完整指南) 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gi…

2026/9/28 19:31:01 阅读更多 →
GD32H759+RT-Thread工控实战:SPI从时序到DMA全解析

GD32H759+RT-Thread工控实战:SPI从时序到DMA全解析

做工控有一段时间的人,基本都被SPI这种看似简单、实则坑深的接口教育过。GD32H759这颗Cortex-M7内核的芯片,在跑RT-Thread做工业现场控制时,SPI几乎绕不开:触摸屏、外部ADC、SPI NOR Flash、编码器读数、数字隔离器通信&#xff0…

2026/9/28 19:31:01 阅读更多 →
开源模型数据合成与安全工具生态:第四周开源工具链全景复盘

开源模型数据合成与安全工具生态:第四周开源工具链全景复盘

在当今以数据为中心(Data-Centric AI)与模型生产合规安全(AI Safety & Alignment)的时代,算法团队的研发效能与安全生产能力,在很大程度上取决于对全球顶尖开源工具链生态的熟练掌握与深度集成。 回顾第…

2026/9/28 19:30:00 阅读更多 →

日新闻

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?…

2026/9/28 0:00:34 阅读更多 →
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例…

2026/9/28 0:00:34 阅读更多 →
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。…

2026/9/28 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 5:40:26 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/28 8:07:01 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/28 3:51:11 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →