File: README.rst

package info (click to toggle)
python-async-generator 1.10-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 268 kB
  • sloc: python: 1,258; makefile: 19
file content (121 lines) | stat: -rw-r--r-- 3,995 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
.. 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.)