@types.coroutine と @asyncio.coroutine デコレータの違いは何ですか? 質問する

@types.coroutine と @asyncio.coroutine デコレータの違いは何ですか? 質問する

ドキュメントには次のように書かれています:

@asyncio.コルーチン

ジェネレータベースのコルーチンをマークするデコレータ。これにより、ジェネレータは yield from を使用して async def コルーチンを呼び出すことができるようになり、また、たとえば await 式を使用して、ジェネレータを async def コルーチンから呼び出すことも可能になります。

_

@types.coroutine(gen_func)

この関数は、ジェネレータ関数を、ジェネレータベースのコルーチンを返すコルーチン関数に変換します。ジェネレータベースのコルーチンは、ジェネレータイテレータのままですが、コルーチンオブジェクトと見なされ、待機可能です。ただし、必ずしもメソッドを実装するとは限りません__await__()

したがって、目的は同じであるように見えます - ジェネレーターをコルーチンとしてフラグ付けすること ( async defPython3.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!」行に立っています)。コンソールにはまだ何も出力されていないため、関数はまだ開始されていません。

PyCharm デバッグ

しかしもし削除したらyieldtypesバージョンは即座に機能を開始します!

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関数を使用します。

おすすめ記事