[Python-Dev] async/await in Python; v2
Andrew Svetlov
andrew.svetlov at gmail.com
Wed Apr 22 21:37:16 CEST 2015
On Wed, Apr 22, 2015 at 10:24 PM, Yury Selivanov
<yselivanov.ml at gmail.com> wrote:
>
>
> 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__())
>
GET_ITER_SPECIAL sounds better than wrapper for `coro.__await__()` call.
> Yury
--
Thanks,
Andrew Svetlov
More information about the Python-Dev
mailing list