[Python-ideas] PEP 530: Asynchronous Comprehensions

C Anthony Risinger anthony at xtfx.me
Tue Sep 6 12:40:27 EDT 2016


On Tue, Sep 6, 2016 at 10:20 AM, Sven R. Kunze <srkunze at mail.de> wrote:

> On 06.09.2016 03:16, Yury Selivanov wrote:
>
>>
>> Whereas the following will produce some sort of async lists, sets, and
>>> dicts?
>>>
>>>     result = [await fun() async for fun in funcs]
>>>>     result = {await fun() async for fun in funcs}
>>>>     result = {fun: await fun() async for fun in funcs}
>>>>
>>>
>>> If so, how do I read values from an async list/set/dict?
>>>
>>
>> Consider "funcs" to be an asynchronous generator/iterable that produces a
>> sequence of awaitables.  The above comprehensions will await on each
>> awaitable in funcs, producing regular list, set, and dict.
>>
>
> So, what's the "async" good for then?


Maybe I'm off base here, but my understanding is the `async for` version
would allow for suspension during the actual iteration, ie. using the
__a*__ protocol methods, and not just by awaiting on the produced item
itself.

IOW, `[await ... async for ...]` will suspend at least twice, once during
iteration using the __a*__ protocols and then again awaiting on the
produced item, whereas `[await ... for ...]` will synchronously produce
items and then suspend on them. So to use the async + await version, your
(async) iterator must return awaitables to satisfy the `async for` part
with then produce another awaitable we explicitly `await` on.

Can someone confirm this understanding? And also that all 4 combinations
are possible, each with different meaning:

# Normal comprehension, 100% synchronous and blocking
[... for ...]

# Blocking/sync iterator producing awaitables which suspend before
producing a "normal" value
[await ... for ...]

# Non-blocking/async iterator that suspends before producing "normal" values
[... async for ...]

# Non-blocking/async iterator that suspends before producing awaitables
which suspend again before producing a "normal" value
[await ... async for ...]

Is this correct?

-- 

C Anthony
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160906/1fea5e2c/attachment.html>


More information about the Python-ideas mailing list