Python asyncio 核心概念
asyncio 是 Python 用于编写并发代码的库,基于协程(coroutines)和事件循环(event loop)。核心对象包括:
- 协程(Coroutine):通过
async def定义的函数,使用await挂起执行。 - 事件循环(Event Loop):调度协程的执行,管理异步任务。
- Future/Task:
Future表示异步操作的最终结果,Task是Future的子类,用于包装协程。
基础用法
定义协程并运行:
import asyncio async def hello(): print("Hello") await asyncio.sleep(1) print("World") asyncio.run(hello()) # 启动事件循环关键点:
asyncio.run()是 Python 3.7+ 的入口函数,负责创建和关闭事件循环。await用于挂起协程,直到异步操作完成(如 I/O 或睡眠)。
任务并发管理
通过create_task或gather实现并发:
async def task1(): await asyncio.sleep(2) return "Task 1" async def task2(): await asyncio.sleep(1) return "Task 2" async def main(): # 方式1:create_task t1 = asyncio.create_task(task1()) t2 = asyncio.create_task(task2()) result1, result2 = await t1, await t2 print(result1, result2) # 方式2:gather results = await asyncio.gather(task1(), task2()) print(results) asyncio.run(main())异步 I/O 操作
与网络请求库(如aiohttp)结合示例:
import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): html = await fetch("https://example.com") print(html[:100]) asyncio.run(main())高级特性
- 超时控制:
async def long_running_task(): await asyncio.sleep(10) return "Done" async def main(): try: result = await asyncio.wait_for(long_running_task(), timeout=2.0) except asyncio.TimeoutError: print("Timeout!")- 队列(Queue):生产者-消费者模式:
async def producer(queue): for i in range(5): await queue.put(i) await asyncio.sleep(0.5) async def consumer(queue): while True: item = await queue.get() print(f"Consumed: {item}") queue.task_done() async def main(): queue = asyncio.Queue() await asyncio.gather(producer(queue), consumer(queue)) asyncio.run(main())https://www.zhihu.com/zvideo/1992081414515102207/
https://www.zhihu.com/zvideo/1992081414288601523/
https://www.zhihu.com/zvideo/1992081411776209412/
https://www.zhihu.com/zvideo/1992081410983490058/
https://www.zhihu.com/zvideo/1992081411017031867/
https://www.zhihu.com/zvideo/1992081409662277143/
https://www.zhihu.com/zvideo/1992081408554997536/
https://www.zhihu.com/zvideo/1992081408483680838/
https://www.zhihu.com/zvideo/1992081406529122697/
https://www.zhihu.com/zvideo/1992081404582978832/
https://www.zhihu.com/zvideo/1992081404620722919/
https://www.zhihu.com/zvideo/1992081402775232642/
https://www.zhihu.com/zvideo/1992081401672139800/
https://www.zhihu.com/zvideo/1992081400329937526/
https://www.zhihu.com/zvideo/1992081399889536407/
https://www.zhihu.com/zvideo/1992081399407215761/
https://www.zhihu.com/zvideo/1992081399839216979/
https://www.zhihu.com/zvideo/1992081399583363803/
https://www.zhihu.com/zvideo/1992081398673208186/
https://www.zhihu.com/zvideo/1992081396286637136/
https://www.zhihu.com/zvideo/1992081394579567804/
https://www.zhihu.com/zvideo/1992081391882612845/
https://www.zhihu.com/zvideo/1992081388866933064/
https://www.zhihu.com/zvideo/1992081390523666922/
https://www.zhihu.com/zvideo/1992081389093427180/
https://www.zhihu.com/zvideo/1992081387851896032/
https://www.zhihu.com/zvideo/1992081387629610814/
https://www.zhihu.com/zvideo/1992081384467109570/
https://www.zhihu.com/zvideo/1992081384504842236/
https://www.zhihu.com/zvideo/1992081382793577889/
https://www.zhihu.com/zvideo/1992081381245866102/
https://www.zhihu.com/zvideo/1992081381375882005/
https://www.zhihu.com/zvideo/1992081380553810780/
https://www.zhihu.com/zvideo/1992081377668133201/
https://www.zhihu.com/zvideo/1992081376422430064/
https://www.zhihu.com/zvideo/1992081374388183350/
https://www.zhihu.com/zvideo/1992081375550010031/
https://www.zhihu.com/zvideo/1992081372085511626/
https://www.zhihu.com/zvideo/1992081369992552985/
https://www.zhihu.com/zvideo/1992081367652127214/
https://www.zhihu.com/zvideo/1992081365609494478/
https://www.zhihu.com/zvideo/1992081364208600440/
https://www.zhihu.com/zvideo/1992081362677699552/
https://www.zhihu.com/zvideo/1992081359297074283/
https://www.zhihu.com/zvideo/1992081358445630208/
https://www.zhihu.com/zvideo/1992081356218467656/
https://www.zhihu.com/zvideo/1992081354221966628/
https://www.zhihu.com/zvideo/1992081354599465668/
https://www.zhihu.com/zvideo/1992081334290633508/
https://www.zhihu.com/zvideo/1992081333414020001/
https://www.zhihu.com/zvideo/1992081332537426047/
https://www.zhihu.com/zvideo/1992081333263024630/
https://www.zhihu.com/zvideo/1992081329756590187/
https://www.zhihu.com/zvideo/1992081329752413320/
调试与错误处理
- 启用调试模式:设置环境变量
PYTHONASYNCIODEBUG=1。 - 捕获异常:协程内使用
try/except,或通过Task.exception()检查任务异常。
性能优化建议
- 避免阻塞操作(如同步 I/O),使用异步兼容库(如
aiofiles替代文件操作)。 - 限制并发量:通过信号量(
asyncio.Semaphore)控制资源使用。
兼容性说明
- Python 3.7+ 推荐使用
asyncio.run(),旧版本需手动管理事件循环。 - 与多线程/多进程交互时,使用
asyncio.to_thread()或loop.run_in_executor()。
通过以上方法,可以高效利用 asyncio 构建高性能异步应用。