Skip to content
Making it easy to write async iterators in Python 3.5
Python Shell
Branch: master
Clone or download
Latest commit 9f0e08c Aug 1, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
async_generator Bump version to 1.10+dev Aug 1, 2018
ci Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
docs Release engineering for 1.10 Aug 1, 2018
newsfragments Release engineering for 1.10 Aug 1, 2018
.appveyor.yml Update CI for 3.7 Aug 1, 2018
.coveragerc [travis] misc improvements Dec 4, 2016
.gitignore Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
.readthedocs.yml Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
.style.yapf Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
.travis.yml Update CI for 3.7 Aug 1, 2018
CODE_OF_CONDUCT.md Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
CONTRIBUTING.md Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
LICENSE Relicense to match trio project standard (Apache 2 + MIT) Jan 19, 2018
LICENSE.APACHE2 Relicense to match trio project standard (Apache 2 + MIT) Jan 19, 2018
LICENSE.MIT Relicense to match trio project standard (Apache 2 + MIT) Jan 19, 2018
MANIFEST.in Add some other missing files to MANIFEST.in Apr 23, 2018
README.rst Fix remaining references to old repository Jan 19, 2018
pyproject.toml Redo everything to match trio style + add a real sphinx manual Jan 19, 2018
setup.py Fix license= field in setup.py Apr 23, 2018
test-requirements.txt Stop using pytest-asyncio Jan 19, 2018

README.rst

Join chatroom Documentation Status Automated test status Automated test status (Windows) Test coverage

The async_generator library

Python 3.6 added async generators. (What's an async generator? Check out my 5-minute lightning talk demo from PyCon 2016.) Python 3.7 adds some more tools to make them usable, like contextlib.asynccontextmanager.

This library gives you all that back to Python 3.5.

For example, this code only works in Python 3.6+:

async def load_json_lines(stream_reader):
    async for line in stream_reader:
        yield json.loads(line)

But this code does the same thing, and works on Python 3.5+:

from async_generator import async_generator, yield_

@async_generator
async def load_json_lines(stream_reader):
    async for line in stream_reader:
        await yield_(json.loads(line))

Or in Python 3.7, you can write:

from contextlib import asynccontextmanager

@asynccontextmanager
async def background_server():
    async with trio.open_nursery() as nursery:
        value = await nursery.start(my_server)
        try:
            yield value
        finally:
            # Kill the server when the scope exits
            nursery.cancel_scope.cancel()

This is the same, but back to 3.5:

from async_generator import async_generator, yield_, asynccontextmanager

@asynccontextmanager
@async_generator
async def background_server():
    async with trio.open_nursery() as nursery:
        value = await nursery.start(my_server)
        try:
            await yield_(value)
        finally:
            # Kill the server when the scope exits
            nursery.cancel_scope.cancel()

(And if you're on 3.6, you can use @asynccontextmanager with native generators.)

Let's do this

How come some of those links talk about "trio"?

Trio is a new async concurrency library for Python that's obsessed with usability and correctness – we want to make it easy to get things right. The async_generator library is maintained by the Trio project as part of that mission, and because Trio uses async_generator internally.

You can use async_generator with any async library. It works great with asyncio, or Twisted, or whatever you like. (But we think Trio is pretty sweet.)

You can’t perform that action at this time.