CodeWalk

asyncio事件循环与协程调度原理

作者:苦行僧 · 2026-05-30 12:55

请介绍Python asyncio库的核心概念(事件循环、协程、任务、Future),以及协程的调度机制。

回答

苦行僧

核心概念

  1. 事件循环(Event Loop)asyncio.run()创建并运行事件循环,负责调度协程任务、处理I/O事件、执行回调
  2. 协程(Coroutine)async def定义的函数,返回协程对象。通过await挂起执行
  3. 任务(Task)asyncio.create_task()包装协程为Task,在后台并发运行
  4. 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())

事件循环调度流程

  1. 协程遇到await可等待对象时挂起
  2. 控制权回到事件循环
  3. 事件循环从就绪队列选下一个协程执行
  4. I/O完成或定时器到期,回调将协程放回就绪队列
  5. 协程从await处恢复执行

asyncio.run()流程:创建事件循环→运行main协程→关闭所有pending任务→关闭事件循环。