The basics

AnyIO requires Python 3.6.2 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 or curio, you can use install them as extras like this:

pip install anyio[curio]

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())

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 run_async_from_thread() to call asynchronous code