ドキュメントには次のように書かれています:
@asyncio.コルーチン
ジェネレータベースのコルーチンをマークするデコレータ。これにより、ジェネレータは yield from を使用して async def コルーチンを呼び出すことができるようになり、また、たとえば await 式を使用して、ジェネレータを async def コルーチンから呼び出すことも可能になります。
_
@types.coroutine(gen_func)
この関数は、ジェネレータ関数を、ジェネレータベースのコルーチンを返すコルーチン関数に変換します。ジェネレータベースのコルーチンは、ジェネレータイテレータのままですが、コルーチンオブジェクトと見なされ、待機可能です。ただし、必ずしもメソッドを実装するとは限りません
__await__()
。
したがって、目的は同じであるように見えます - ジェネレーターをコルーチンとしてフラグ付けすること ( async def
Python3.5 以降ではいくつかの機能で実行されます)。
asyncio.coroutine
いつ使用する必要があるのかtypes.coroutine
、その違いは何ですか?
ベストアンサー1
違いは、yield ステートメントがあるかどうかです。コードは次のとおりです。
from types import coroutine as t_coroutine
from asyncio import coroutine as a_coroutine, ensure_future, sleep, get_event_loop
@a_coroutine
def a_sleep():
print("doing something in async")
yield 1
@t_coroutine
def t_sleep():
print("doing something in types")
yield 1
async def start():
sleep_a = a_sleep()
sleep_t = t_sleep()
print("Going down!")
loop = get_event_loop()
loop.run_until_complete(start())
この例では、すべてが同じように見えます - pycharm からのデバッグ情報は次のとおりです (「Going down!」行に立っています)。コンソールにはまだ何も出力されていないため、関数はまだ開始されていません。
しかしもし削除したらyield
、types
バージョンは即座に機能を開始します!
from types import coroutine as t_coroutine
from asyncio import coroutine as a_coroutine, ensure_future, sleep, get_event_loop
@a_coroutine
def a_sleep():
print("doing something in async")
@t_coroutine
def t_sleep():
print("doing something in types")
async def start():
sleep_a = a_sleep()
sleep_t = t_sleep()
print("Going down!")
loop = get_event_loop()
loop.run_until_complete(start())
コンソールに出力されましたdoing something in types
。デバッグ情報は次のとおりです。
ご覧のように電話後すぐに始まります結果がない場合は None を返します。
使用法としては、asyncio
常にバージョンを使用する必要があります。次のように実行する必要がある場合は、発射して忘れる(即座に実行され、後で結果が取得されます) -ensure_future
関数を使用します。