讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Python/FastAPI 中监控事件循环中的待处理异步任务

云伟小哥_9096

云伟小哥_9096

发布时间:2026-04-11 10:53:16

|

382人浏览过

|

来源于php中文网

原创

如何在 Python/FastAPI 中监控事件循环中的待处理异步任务

本文详解如何使用 asyncio.all_tasks() 实时获取并分析当前事件循环中所有未完成的异步任务,帮助定位 fastapi 应用性能瓶颈、任务积压或长时阻塞问题。

本文详解如何使用 asyncio.all_tasks() 实时获取并分析当前事件循环中所有未完成的异步任务,帮助定位 fastapi 应用性能瓶颈、任务积压或长时阻塞问题。

在构建高并发 FastAPI 服务时,理解异步任务的生命周期至关重要。你提到的“每次 await 都会调度一个任务、形成 backlog”的直觉有一定合理性,但需澄清:await 本身并不直接创建新任务——它只是挂起当前协程,将控制权交还事件循环;真正生成可被调度的独立执行单元(即 asyncio.Task)的是显式调用 asyncio.create_task()、asyncio.ensure_future(),或由框架(如 FastAPI 的 BackgroundTasks、Depends 异步依赖)自动封装的协程。当事件循环因 I/O 阻塞、CPU 密集型操作未让出、或任务调度失衡而变慢时,未完成的 Task 数量确实可能持续增长,成为可观测的性能劣化信号。

✅ 获取所有待处理与运行中任务

Python 标准库提供了权威且轻量的接口:asyncio.all_tasks(loop=None)。它返回一个 set,包含当前运行事件循环中所有尚未完成(done() is False)的 Task 对象,涵盖三类状态:

  • ✅ 已调度但尚未开始执行(pending)
  • ✅ 正在运行(running),包括当前正在执行 all_tasks() 的协程自身(即当前 Task 也会被包含)
  • ✅ 已暂停(suspended),例如在 await asyncio.sleep(1) 或 await httpx.AsyncClient().get(...) 期间
import asyncio
import logging

# 在任意 async 函数内调用(如 FastAPI 路由、中间件或健康检查端点)
async def debug_pending_tasks():
    tasks = asyncio.all_tasks()  # 自动获取当前运行的 event loop
    logging.info(f"当前待处理/运行中任务总数: {len(tasks)}")

    for task in tasks:
        # 简洁日志:任务名、状态、协程位置
        status = "pending" if not task.done() else "done"
        coro_name = task.get_coro().__qualname__ if task.get_coro() else "unknown"
        logging.debug(f"Task {task.get_name()} [{status}] → {coro_name}")

    return {"total_pending": len(tasks), "tasks": [t.get_name() for t in tasks]}

? 注意:asyncio.all_tasks() 不包含普通协程(coroutine 对象),只返回已通过 create_task() 等方式“升格”为 Task 的可调度实体。这是关键设计——只有 Task 才具备独立取消、命名、错误传播等能力。

? 深度诊断:定位卡顿与堆积根源

单纯统计数量不够,还需结合上下文分析。以下两个实用技巧可快速定位异常:

python全能编程助手
python全能编程助手

SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、

下载

立即学习Python免费学习笔记(深入)”;

1. 输出每个任务的完整调用栈(识别阻塞点)

for task in asyncio.all_tasks():
    if not task.done() and not task.cancelled():
        # 打印堆栈,精准定位 await 卡在何处(如某次数据库查询、第三方 API 调用)
        task.print_stack(limit=5)  # 仅显示最深 5 层,避免日志爆炸

2. 构建实时监控端点(FastAPI 示例)

from fastapi import APIRouter, Depends
from starlette.responses import JSONResponse

router = APIRouter()

@router.get("/debug/tasks")
async def list_pending_tasks():
    loop = asyncio.get_running_loop()
    tasks = asyncio.all_tasks(loop)

    task_info = []
    for task in tasks:
        info = {
            "name": task.get_name(),
            "state": "pending" if not task.done() else ("cancelled" if task.cancelled() else "done"),
            "created_at": getattr(task, "_source_traceback", "N/A"),  # 非标准属性,需配合调试器
        }
        # 可选:记录任务创建时间(需自定义 Task 类或使用 asyncio-monitor 等工具)
        task_info.append(info)

    return JSONResponse(content={
        "total": len(tasks),
        "pending": len([t for t in tasks if not t.done()]),
        "details": task_info
    })

部署后访问 /debug/tasks 即可获得结构化任务快照,便于集成 Prometheus 或 Grafana 做趋势监控。

⚠️ 重要注意事项

  • 不要在生产高频路由中频繁调用:all_tasks() 是轻量操作,但遍历 + print_stack() 会产生可观开销,建议仅用于诊断端点或低频健康检查。
  • asyncio.run() 会创建根任务:主程序入口(如 asyncio.run(main()))本身也是一个 Task,始终包含在结果集中,勿误判为“异常堆积”。
  • 区分“待处理”与“积压”:少量 pending 任务是异步常态;需关注长时间(如 >30s)未完成的任务,结合 task.get_coro() 和堆栈判断是否陷入死锁、未超时的网络请求或 CPU 密集循环。
  • FastAPI 的生命周期绑定:在 startup 事件中启动后台监控协程(如每 5 秒采样一次),比每次请求都查更高效:
    @app.on_event("startup")
    async def start_task_monitor():
        asyncio.create_task(_monitor_task_backlog())

掌握 asyncio.all_tasks(),你就拥有了透视 FastAPI 异步内核的“X 光机”。它不解决性能问题本身,但能让你在毫秒级延迟出现前,就看见那条正在缓慢膨胀的任务队列——而这,正是工程化可观测性的起点。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1531

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3584

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1549

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

20397

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2527

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2587

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1063

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.08.10

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

160

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn