基础知识

The basics

AnyIO 需要 Python 3.8 或更高版本才能运行。建议在开发或使用 AnyIO 时设置 virtualenv

安装

Installation

要安装 AnyIO, 请运行:

pip install anyio

要安装支持 Trio 的版本,可以像这样将其作为附加组件安装:

pip install anyio[trio]

运行异步程序

Running async programs

最简单的 AnyIO 程序如下所示:

from anyio import run


async def main():
    print('Hello, world!')

run(main)

这将在默认后端(asyncio)上运行上述程序。要在另一个支持的后端(如 Trio )上运行,可以使用 backend 参数,如下所示:

run(main, backend='trio')

但 AnyIO 代码并不要求通过 run() 运行。你也可以直接使用后端库的原生 run() 函数:

import sniffio
import trio
from anyio import sleep


async def main():
    print('Hello')
    await sleep(1)
    print("I'm running on", sniffio.current_async_library())

trio.run(main)

在 4.0.0 版本发生变更: asyncio 后端,对于 Python 3.11 之前的版本, anyio.run() 现在使用了回溯移植版的 asyncio.Runner

后端特定选项

Backend specific options

Asyncio:

  • 选项见 asyncio.Runner 的文档

  • use_uvloopbool, 默认为 False):如果可用,使用更快的 uvloop 事件循环实现(这是传递 loop_factory=uvloop.new_event_loop 的简写,如果 loop_factory 传递了非 None 的值, 则该选项会被忽略)

Trio:选项请参考 官方文档

在 3.2.0 版本发生变更: use_uvloop 的默认值已更改为 False

在 4.0.0 版本发生变更: policy 选项已被 loop_factory 替代。

使用原生异步库

Using native async libraries

AnyIO 允许你将为 AnyIO 编写的代码与为你选择的异步框架编写的代码混合使用。不过,有一些规则需要记住:

  • 你只能使用与你运行的后端相对应的“原生”库,因此,例如,不能将为 Trio 编写的库与为 asyncio 编写的库一起使用。

  • Trio 以外的后端上,由这些“原生”库生成的任务不受 AnyIO 强制执行的取消规则的约束。

  • 在 AnyIO 之外生成的线程不能使用 from_thread.run() 来调用异步代码。