The basics
AnyIO requires Python 3.8 or later to run. It is recommended that you set up a virtualenv when developing or playing around with AnyIO.
Installation
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!')
run(main)
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():
print('Hello')
await sleep(1)
print("I'm running on", sniffio.current_async_library())
trio.run(main)
Changed in version 4.0.0: On the asyncio
backend, anyio.run()
now uses a back-ported version of
asyncio.Runner
on Pythons older than 3.11.
Backend specific options
Asyncio:
options covered in the documentation of
asyncio.Runner
use_uvloop
(bool
, default=False): Use the faster uvloop event loop implementation, if available (this is a shorthand for passingloop_factory=uvloop.new_event_loop
, and is ignored ifloop_factory
is passed a value other thanNone
)
Trio: options covered in the official documentation
Changed in version 3.2.0: The default value of use_uvloop
was changed to False
.
Changed in version 4.0.0: The policy
option was replaced with loop_factory
.
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
from_thread.run()
to call asynchronous code