The basics

AnyIO requires Python 3.7 or later to run. It is recommended that you set up a virtualenv when developing or playing around with AnyIO.


To install AnyIO, run:

pip install anyio

To install a supported version of trio, you can install it as an extra like this:

pip install anyio[trio]

Running async programs

The simplest possible AnyIO program looks like this:

from anyio import run

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


This will run the program above on the default backend (asyncio). To run it on another supported backend, say trio, you can use the backend argument, like so:

run(main, backend='trio')

But AnyIO code is not required to be run via run(). You can just as well use the native run() function of the backend library:

import sniffio
import trio
from anyio import sleep

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

Backend specific options


  • debug (bool, default=False): Enables debug mode in the event loop

  • use_uvloop (bool, default=False): Use the faster uvloop event loop implementation, if available

  • policy (AbstractEventLoopPolicy, default=None): the event loop policy instance to use for creating a new event loop (overrides use_uvloop)

Trio: options covered in the official documentation


The default value of use_uvloop was True before v3.2.0.

Using native async libraries

AnyIO lets you mix and match code written for AnyIO and code written for the asynchronous framework of your choice. There are a few rules to keep in mind however:

  • You can only use “native” libraries for the backend you’re running, so you cannot, for example, use a library written for trio together with a library written for asyncio.

  • Tasks spawned by these “native” libraries on backends other than trio are not subject to the cancellation rules enforced by AnyIO

  • Threads spawned outside of AnyIO cannot use to call asynchronous code