freshcrate
Skin:/
Home > Frameworks > async-generator

async-generator

Async generators and context managers for Python 3.5+

Why this rank:Strong adoptionRelease freshnessHealthy release cadence

Description

.. image:: https://img.shields.io/badge/chat-join%20now-blue.svg :target: https://gitter.im/python-trio/general :alt: Join chatroom .. image:: https://img.shields.io/badge/docs-read%20now-blue.svg :target: https://async-generator.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status .. image:: https://travis-ci.org/python-trio/async_generator.svg?branch=master :target: https://travis-ci.org/python-trio/async_generator :alt: Automated test status .. image:: https://ci.appveyor.com/api/projects/status/af4eyed8o8tc3t0r/branch/master?svg=true :target: https://ci.appveyor.com/project/python-trio/trio/history :alt: Automated test status (Windows) .. image:: https://codecov.io/gh/python-trio/async_generator/branch/master/graph/badge.svg :target: https://codecov.io/gh/python-trio/async_generator :alt: Test coverage The async_generator library =========================== Python 3.6 added `async generators <https://www.python.org/dev/peps/pep-0525/>`__. (What's an async generator? `Check out my 5-minute lightning talk demo from PyCon 2016 <https://youtu.be/PulzIT8KYLk?t=24m30s>`__.) 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+: .. code-block:: python3 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+: .. code-block:: python3 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: .. code-block:: python3 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: .. code-block:: python3 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 ============= * Install: ``python3 -m pip install -U async_generator`` (or on Windows, maybe ``py -3 -m pip install -U async_generator`` * Manual: https://async-generator.readthedocs.io/ * Bug tracker and source code: https://github.com/python-trio/async_generator * Real-time chat: https://gitter.im/python-trio/general * License: MIT or Apache 2, your choice * Contributor guide: https://trio.readthedocs.io/en/latest/contributing.html * Code of conduct: Contributors are requested to follow our `code of conduct <https://trio.readthedocs.io/en/latest/code-of-conduct.html>`__ in all project spaces. How come some of those links talk about "trio"? =============================================== `Trio <https://trio.readthedocs.io>`__ 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.)

Release History

VersionChangesUrgencyDate
1.10Imported from PyPI (1.10)Low4/21/2026
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
master@2020-08-24Latest activity on master branchLow8/24/2020
v1.10Tag v1.10Low8/1/2018
v1.9Tag v1.9Low1/19/2018
v1.8Tag v1.8Low6/18/2017
v1.7Tag v1.7Low5/13/2017
v1.6Tag v1.6Low2/18/2017
v1.5Tag v1.5Low1/15/2017
v1.4Tag v1.4Low12/6/2016
v1.3Tag v1.3Low11/25/2016
v1.2Tag v1.2Low11/15/2016
v1.1Tag v1.1Low11/7/2016
v1.0Tag v1.0Low7/3/2016
v0.0.1Tag v0.0.1Low5/31/2016

Dependencies & License Audit

Loading dependencies...

Similar Packages

greenbackReenter an async event loop from synchronous code1.3.0
trioA friendly Python library for async concurrency and I/O0.33.0
sniffioSniff out which async library your code is running under1.3.1
tqdmFast, Extensible Progress Meterv4.68.1
inspect-aiFramework for large language model evaluationsmain@2026-06-05

More in Frameworks

langchainThe agent engineering platform
deer-flowAn open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message gateway, it handles different levels of ta
tqdmFast, Extensible Progress Meter
simBuild, deploy, and orchestrate AI agents. Sim is the central intelligence layer for your AI workforce.