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() 更适合批量等待一组协程结果。


# python  # ai 


相关栏目: 【 网站优化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 - 解压缩多个文件或文件夹实例  网站制作报价单模板图片,小松挖机官方网站报价?