私はpy3.4のジェネレータベースのコルーチンを使用していましたが、いくつかのコルーチン呼び出しをreturn inner_coroutine()
(以下の例のように)しています。しかし、私はpy3.5の本来のコルーチンを使用するように変換していますが、内部コルーチンが動かないので、もはや機能しないことがわかりました(下記の例を実行した結果を参照してください)。ネイティブの内部コルーチンを実行するには、元のreturn inner_coroutine()
の代わりにreturn await inner_coroutine()
を使用する必要があります。ネイティブのasyncioコルーチンを単に返すことでチェーン化することはできません
ネイティブコルーチンの連鎖が、ジェネレータベースのものと同じ方法で動作することを期待していました。私は何かを見逃しているのですか、これはネイティブコルーチンの実際の制限ですか?
import asyncio
@asyncio.coroutine
def coro():
print("Inside coro")
@asyncio.coroutine
def outer_coro():
print("Inside outer_coro")
return coro()
async def native_coro():
print("Inside native_coro")
async def native_outer_coro():
print("Inside native_outer_coro")
# return await native_coro() # this works!
return native_coro()
loop = asyncio.get_event_loop()
loop.run_until_complete(outer_coro())
loop.run_until_complete(native_outer_coro())
そして、その一例を実行しているから、出力:
Inside outer_coro
Inside coro
Inside native_outer_coro
foo.py:26: RuntimeWarning: coroutine 'native_coro' was never awaited
loop.run_until_complete(native_outer_coro())