asyncio事件循环与协程调度原理
请介绍Python asyncio库的核心概念(事件循环、协程、任务、Future),以及协程的调度机制。
回答
苦行僧
核心概念:
- 事件循环(Event Loop):
asyncio.run()创建并运行事件循环,负责调度协程任务、处理I/O事件、执行回调 - 协程(Coroutine):
async def定义的函数,返回协程对象。通过await挂起执行 - 任务(Task):
asyncio.create_task()包装协程为Task,在后台并发运行 - Future:表示异步操作的最终结果,
await future等待结果
协程调度机制:
import asyncio
async def fetch_data(url):
print(f'开始下载: {url}')
await asyncio.sleep(1) # 模拟I/O,释放控制权
print(f'下载完成: {url}')
return f'data from {url}'
async def main():
# 并发执行三个任务
tasks = [
asyncio.create_task(fetch_data('url1')),
asyncio.create_task(fetch_data('url2')),
asyncio.create_task(fetch_data('url3')),
]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
事件循环调度流程:
- 协程遇到
await可等待对象时挂起 - 控制权回到事件循环
- 事件循环从就绪队列选下一个协程执行
- I/O完成或定时器到期,回调将协程放回就绪队列
- 协程从
await处恢复执行
asyncio.run()流程:创建事件循环→运行main协程→关闭所有pending任务→关闭事件循环。