[Python-Dev] async/await in Python; v2

Yury Selivanov yselivanov.ml at gmail.com
Wed Apr 22 21:24:41 CEST 2015



On 2015-04-22 2:53 PM, Andrew Svetlov wrote:
> On Wed, Apr 22, 2015 at 9:45 PM, Yury Selivanov <yselivanov.ml at gmail.com> wrote:
[...]
>>
>>> If we forbid to call `async def` from regualr code how asyncio should
>>> work? I'd like to push `async def` everywhere in asyncio API where
>>> asyncio.coroutine required.
>>
>> You'll have to use a wrapper that will do the following:
>>
>> async def foo():
>>      return 'spam'
>>
>> @asyncio.coroutine
>> def bar():
>>      what = yield from foo.__await__(foo, *args, **kwargs)
>>      # OR:
>>      what = yield from await_call(foo, *args, **kwargs)
>>
> If I cannot directly use `yield from f()` with `async def f():` then
> almost every `yield from` inside asyncio library should be wrapped in
> `await_call()`. Every third-party asyncio-based library should do the
> same.
>
> Also I expect a performance degradation on `await_call()` calls.
>

I think there is another way... instead of pushing

GET_ITER
...
YIELD_FROM

opcodes, we'll need to replace GET_ITER with another one:

GET_ITER_SPECIAL
...
YIELD_FROM


Where "GET_ITER_SPECIAL (obj)" (just a working name) would check
that if the current code object has CO_COROUTINE and the
object that you will yield-from has it as well, it would
push to the stack the result of (obj.__await__())

Yury


More information about the Python-Dev mailing list