web-dev-qa-db-ja.com

asyncioで「yield from」構文は何を行い、「await」とどのように違いますか

Asyncioコードを書いたが、内部の仕組みをよりよく理解しようとしている人の観点から、yield fromawaitとは何ですか。また、非同期コードを許可するのにどのように役立ちますか。

非常に高い投票yield from構文の使用について尋ねる質問と asyncとawaitを説明するもの がありますが、両方とも異なるトピックについて深く掘り下げており、そうではありません基盤となるコードと、それがasyncioにどのように適合するかについての簡潔な説明です。

29
Azsgy

短い答え:

_yield from_は、asyncioのコルーチンを待つ古い方法です。

awaitは、asyncioのコルーチンを待つ最新の方法です。

詳細な回答:

Pythonにはジェネレーターがあります-単一の値ではなく、結果のシーケンスを生成する特別な種類の関数。 Python 3.3 _yield from_式が追加されました。It allows 操作の一部を別のジェネレーターに委任する1つのジェネレーター。

Python 3.4 asyncioモジュールが標準ライブラリに追加されました。明確で理解可能な非同期コードを記述できます。技術的にasyncioのコルーチンはさまざまな方法で実装できますが、asyncioexcellent video は、ジェネレーターを使用してコルーチンを実装する方法を示しています)_@asyncio.coroutine_はジェネレーターからコルーチンを作成する方法であり、_yield from_は待機する方法でしたコルーチン-実装の詳細。

_yield from_が2つの「異なるもの」に使用されるようになったのは、そのためです。

Python 3.5( PEP 492 を参照)で始まるコルーチンに新しい構文が追加されました。コルーチンを_async def_で定義し、await式を使用して待機できます。書くのが短くなるだけでなく、asyncioのコルーチンを使用していることを理解しやすくなります。

Python 3.5+を使用している場合、asyncioのコルーチンに_yield from_を使用することを忘れて、awaitを使用することができます。

39