0

0

Python Task怎么创建_asyncio.create_task()将协程包装为任务加入事件循环调度

P粉602998670

P粉602998670

发布时间:2026-03-13 15:17:31

|

242人浏览过

|

来源于php中文网

原创

asyncio.create_task()只接受协程对象,必须在运行中的事件循环内调用;传入普通函数会报TypeError,未await的协程或同步函数需先包装;任务创建后需显式await或保持主协程运行。

python task怎么创建_asyncio.create_task()将协程包装为任务加入事件循环调度

asyncio.create_task() 为什么不能直接传普通函数

因为 asyncio.create_task() 只接受协程对象(coroutine object),不是任意可调用对象。你写 def func(): ...lambda: ...,它返回的是函数对象,不是协程——扔进去会报 TypeError: a coroutine was expected, got <function ...></function>

常见错误现象:把同步函数或未 await 的协程(比如只写了 my_coro() 没加括号调用)传给 create_task();或者误以为装饰器(如 @sync_to_async)能自动转成协程对象,其实它返回的仍是包装后的可调用对象,不是协程。

  • 确认你传进去的是「调用后立刻返回协程对象」的表达式,典型就是 my_coro()(注意括号)
  • 别传 my_coro(没括号)、lambda: my_coro()functools.partial(my_coro)
  • 如果函数是同步的,必须先用 asyncio.to_thread()(Python 3.9+)或 loop.run_in_executor() 包一层,再传给 create_task()

在哪个上下文里调用 create_task() 才有效

必须在已运行的事件循环内调用,否则会报 RuntimeError: no running event loop。也就是说,不能在模块顶层、普通函数体里、或同步主函数中直接调用——哪怕你写了 async def,但没用 asyncio.run() 或手动启动循环,它就只是个函数定义。

使用场景很明确:只应在 async 函数内部、且该 async 函数本身已被事件循环调度执行时调用。

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

  • ✅ 正确位置:async def main(): task = asyncio.create_task(some_coro()),然后用 asyncio.run(main())
  • ❌ 错误位置:脚本最外层、if __name__ == "__main__": 块里直接写 asyncio.create_task(...)
  • ⚠️ 特殊情况:如果你用的是 Jupyter(IPython 8.0+),它默认启用了异步事件循环,此时顶层调用可能“看起来”能跑,但行为不可靠,不建议依赖

create_task() 和 ensure_future() 有啥实际区别

对绝大多数日常使用来说,没区别。两者都把协程包装成 Task 对象并调度,但语义和参数支持略有不同。

零沫AI工具导航
零沫AI工具导航

零沫AI工具导航-AI导航新标杆,探索全球实用AI工具

下载

ensure_future() 更底层,支持传入 FutureTask、协程、甚至实现了 __await__ 的对象;而 create_task() 是它的简化封装,只接受协程对象,且强制绑定当前事件循环(避免跨循环误用)。

  • 优先用 create_task():更安全,类型检查友好,PyCharm / mypy 能更好推导
  • 只有当你需要包装一个已存在的 Future(比如来自 loop.create_future())时,才用 ensure_future()
  • 别用 asyncio.Task(coroutine) 手动构造——它绕过事件循环检查,容易出错,文档明确不推荐

任务没运行?可能是忘了 await 或没 hold 住事件循环

调用 create_task() 只是把任务提交进队列,不代表它会立刻执行完。如果你在 main() 里创建了任务,但没 await 它、也没 await asyncio.sleep(0) 让出控制权,或者没等它完成就退出,那任务很可能被取消或直接丢弃。

典型错误现象:打印日志没输出、HTTP 请求没发出、文件没写入——不是任务没建,是根本没轮到它跑。

  • 确保你在创建任务后,至少做了其中一项:await taskawait asyncio.gather(task)await asyncio.wait([task])
  • 如果想让任务后台运行,也要保证主协程不提前结束,例如用 await asyncio.Event().wait() 卡住,或用 asyncio.run() 包住整个逻辑
  • 任务被取消时会抛 CancelledError,但默认静默——如果要调试,可以加 try/except CancelledError: 或启用 asyncio.get_event_loop().set_debug(True)

最容易被忽略的一点:任务对象本身是强引用,但如果创建它的协程结束了,又没其他变量引用该任务,它可能被垃圾回收——尤其在短生命周期的 async 函数里,记得把 task 存到列表或类属性里,除非你明确希望它被自动清理。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

61

2026.01.05

pycharm怎么改成中文
pycharm怎么改成中文

PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。php中文网给大家带来了pycharm相关的教程以及文章,欢迎大家前来学习和阅读。

229

2023.07.25

pycharm安装教程
pycharm安装教程

PyCharm是一款由JetBrains开发的Python集成开发环境(IDE),它提供了许多方便的功能和工具。本专题为大家带来pycharm安装教程,帮助大家解决问题。

214

2023.08.21

如何解决pycharm找不到模块
如何解决pycharm找不到模块

解决pycharm找不到模块的方法:1、检查python解释器;2、安装缺失的模块;3、检查项目结构;4、检查系统路径;5、使用虚拟环境;6、重启PyCharm或电脑。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

667

2023.12.04

如何安装pycharm
如何安装pycharm

安装pycharm的步骤:1、访问PyCharm官方网站下载最新版本的PyCharm;2、下载完成后,打开安装文件;3、安装完成后,打开PyCharm;4、在PyCharm的主界面中等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

154

2024.02.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号