Python异步编程协程_事件循环解析【教程】
发布时间 - 2025-12-30 00:00:00 点击率:次Python异步编程的核心是协程与事件循环配合:协程需由事件循环调度执行,asyncio.run()是推荐的启动方式,await用于让出控制权,create_task()或gather()实现并发。
Python异步编程的核心是协程(coroutine)与事件循环(event loop)的配合。协程本身不自动运行,必须由事件循环调度执行;而事件循环是异步程序的“心脏”,负责监听I/O事件、分发任务、驱动协程推进。
协程不是线程,也不自动并发
定义一个 async def 函数只是创建了一个协程对象,它不会立即执行:
async def fetch_data():
print("start")
await asyncio.sleep(1)
print("done")
coro = fetch_data() # 此时什么都没发生
协程对象需要被“提交”给事件循环才能运行。直接调用 coro.send(None) 或手动驱动会绕过事件循环,失去异步能力,也容易出错。
事件循环是唯一调度中心
Python 3.7+ 推荐使用 asyncio.run() 启动主协程,它会自动创建并管理一个事件循环:
-
asyncio.run(main()):最简方式,适合脚本和主入口,运行结束后自动关闭循环 -
asyncio.get_event_loop():获取当前线程的默认循环(已弃用,不推荐) -
asyncio.new_event_loop()+set_event_loop():用于多线程场景,需自行管理生命周期
注意:一个线程只能有一个运行中的事件循环;多次调用 run() 会报错“event loop is running”。
await 的本质是让出控制权
await 表达式不是等待,而是向事件循环发出信号:“我暂时不干活了,请去执行别的协程”。事件循环会在被 await 的对象(如 asyncio.sleep()、aiohttp.get())准备好后,恢复该协程继续执行。
- 只能在
async def函数中使用await - 被 await 的对象必须是 awaitable:协程对象、带
__await__方法的对象、或Future实例 -
await asyncio.sleep(0)是主动让出一次调度权的常用技巧
并发靠 asyncio.create_task() 或 gather()
单个 await coro 是顺序执行;要真正并发,需把多个协程包装为任务并同时提交:
async def main(): task1 = asyncio.create_task(fetch_data("A")) task2 = asyncio.create_task(fetch_data("B")) await task1 await task2 # 等两个都完成
或更简洁地:
await asyncio.gather(fetch_data("A"), fetch_data("B"))
create_task() 立即调度协程,适合需要提前启动、中间有逻辑判断、或需取消任务的场景;gather() 更适合批量等待一组协程结果。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
BootStrap整体框架之基础布局组件
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Android Socket接口实现即时通讯实例代码
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel如何处理异常和错误?(Handler示例)
LinuxShell函数封装方法_脚本复用设计思路【教程】
Laravel Fortify是什么,和Jetstream有什么关系
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
JS弹性运动实现方法分析
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
如何用狗爹虚拟主机快速搭建网站?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Java垃圾回收器的方法和原理总结
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel怎么为数据库表字段添加索引以优化查询
如何快速搭建FTP站点实现文件共享?
如何用搬瓦工VPS快速搭建个人网站?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
太平洋网站制作公司,网络用语太平洋是什么意思?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
如何快速生成凡客建站的专业级图册?
PHP正则匹配日期和时间(时间戳转换)的实例代码
WordPress 子目录安装中正确处理脚本路径的完整指南
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
香港网站服务器数量如何影响SEO优化效果?
如何快速查询网站的真实建站时间?
浅谈Javascript中的Label语句
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何在Windows虚拟主机上快速搭建网站?
如何自定义建站之星网站的导航菜单样式?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
无锡营销型网站制作公司,无锡网选车牌流程?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
Laravel如何使用withoutEvents方法临时禁用模型事件
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
高防服务器租用如何选择配置与防御等级?
历史网站制作软件,华为如何找回被删除的网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
php json中文编码为null的解决办法
Java解压缩zip - 解压缩多个文件或文件夹实例
网站制作报价单模板图片,小松挖机官方网站报价?


nc def main():
task1 = asyncio.create_task(fetch_data("A"))
task2 = asyncio.create_task(fetch_data("B"))
await task1
await task2 # 等两个都完成