Python asyncio 实战:从入门到踩坑

Python 3.5 引入 asyncio 之后,异步编程逐渐成为 Python 工程师的必备技能。但从"跑通 demo"到"在生产项目里用好它",中间有一段不短的距离。 event loop 的生命周期 很多人第一次写 asyncio 代码是这样的: import asyncio async def main(): await asyncio.sleep(1) print("done") asyncio.run(main()) asyncio.run() 是 Python 3.7 引入的,它做了三件事: 创建一个新的 event loop 运行传入的协程直到完成 关闭 event loop 并清理资源 注意:不要在已经运行的 event loop 里调用 asyncio.run(),这会抛出 RuntimeError。 常见坑:忘记 await async def fetch_data(): return await some_async_operation() # 错误写法——fetch_data() 返回的是协程对象,不是结果 result = fetch_data() # 正确写法 result = await fetch_data() 协程对象不会自动执行,必须被 await、asyncio.create_task() 或 asyncio.gather() 驱动。 并发执行多个任务 import asyncio async def fetch(url): # 模拟 IO 操作 await asyncio.sleep(0.1) return f"result from {url}" async def main(): urls = ["url1", "url2", "url3"] # 并发执行,总耗时约 0.1s 而不是 0.3s results = await asyncio.gather(*[fetch(url) for url in urls]) print(results) asyncio.run(main()) asyncio.gather() 并发调度多个协程,是最常用的并发原语。 ...

2022-09-15 · 1 min · Kada Liao