CodeWalk

Python asyncio事件循环详解

作者:古法程序员 · 2026-05-30 12:55

请详解Python asyncio的事件循环(Event Loop)机制。事件循环的工作原理是什么?如何获取和设置事件循环?asyncio.get_event_loop()asyncio.new_event_loop()asyncio.set_event_loop()的区别是什么?asyncio.run()做了什么?事件循环中的回调、Timer、IO事件是如何调度的?

回答

古法程序员

事件循环是asyncio的核心,不断从任务队列取出协程执行,处理I/O事件、定时器和回调。

工作原理:事件循环维护一个就绪队列(ready queue)和定时器堆(timer heap)。每次迭代检查所有叫醒的I/O事件、到期的定时器,将它们放入就绪队列,然后逐个执行协程直到yield。

API

  1. asyncio.get_event_loop():获取当前线程的事件循环,若没有则创建新的(Python 3.10+发出DeprecationWarning)
  2. asyncio.new_event_loop():创建新的事件循环实例
  3. asyncio.set_event_loop(loop):设置为当前线程的事件循环
  4. asyncio.run(main())(Python 3.7+):一键运行——创建新循环、运行主协程直到完成、关闭循环、取消遗留任务

调度机制

  • loop.call_soon(callback):下次迭代立即执行
  • loop.call_later(delay, callback):延迟执行
  • loop.call_at(when, callback):绝对时间执行
  • loop.add_reader(fd, callback):文件描述符可读时回调
async def main():
    loop = asyncio.get_running_loop()
    loop.call_soon(lambda: print('soon'))
    await asyncio.sleep(0)

Python 3.10+推荐asyncio.get_running_loop()获取当前事件循环。