Skip to content

eventloop

事件循环 是每个 asyncio 应用的核心,事件循环会运行异步任务和回调,执行网络 IO 操作以及运行子进程。

Note

通常应用程序开发应当使用高层级的例如 asyncio.run() 方法。当然如果是库和框架的编写者需要更细致的控制事件循环的行为才会使用这里的低层级代码。

Note

事件循环内使用 selectors 模块,selectors 模块提供了对 select()pool() 函数的访问,这两个方法是实现异步的核心。

获取事件循环

有三个方法来设置、获取和创建事件循环:

  • asyncio.get_running_loop(): 返回当前线程中正在运行的事件循环,如果没有引发 RuntimeError,此函数只能在协程和回调函数中调用
  • asyncio.set_event_loop(loop): 将 loop 设置为当前线程的当前事件循环
  • asyncio.new_event_loop(): 创建并返回一个新的事件循环对象

方法集

事件循环是 asyncio 的核心,我们传入的方法都将被事件循环来运行和管理。事件循环对象上绑定了很多方法来管理这些任务,他们都是相对底层的方法,通常供库编写者使用,这些方法集的功能包括:

  • 运行和停止循环: 用户通常使用来管理
  • 绑定回调: 能够添加多个回调,他会根据注册顺序被调用。事件循环的所有异步任务都会执行该回调
  • 定时器回调: 事件循环使用单调时钟来跟踪时间来调用回调。用户可以使用 asyncio.sleep() 来模拟
  • 创建 Future 和 Task: 用户级的 asyncio.create_task() 方法在主线程的事件循环中执行异步任务,这里的能够更加细致的控制任务执行的事件循环
  • 网络连接: 对流式传输(TCP/IP)、套接字(Socket)的异步支持
  • 网络服务: 提供了 Server 对象来作为 TCP 或 Scoket 服务器
  • 传输文件
  • 监控文件描述符: 监控 fd 是否可读、可写
  • DNS
  • 管道
  • Unix 信号
  • 运行命令: 异步执行 shell 命令
  • 线程或进程池中执行代码: 调度执行 concurrent.futures.Executor 任务
  • 错误处理

Tips

他们大多数都在 asyncio 上绑定了高层级的方法供用户使用,他们会自动由主线程的事件循环执行,这里通常由库编写者编写用于更细节的控制任务