web-dev-qa-db-ja.com

「asyncio.sleep(delay)」から何が得られますか?

NutshellのPythonからの次の例では、xを_23_に2秒半遅れて設定します。

_@asyncio.coroutine
def delayed_result(delay, result):
  yield from asyncio.sleep(delay)
  return result

loop = asyncio.get_event_loop()
x = loop.run_until_complete(delayed_result(1.5, 23))
_

yield from asyncio.sleep(delay)が何をするのか理解するのが難しいと感じています。

https://docs.python.org/3/library/asyncio-task.html#asyncio.sleep から

_Coroutine asyncio.sleep(delay, result=None, *, loop=None)
_

指定された時間(秒単位)後に完了するコルーチンを作成します。結果が提供される場合、コルーチンが完了すると、呼び出し元に結果が生成されます。

したがって、asyncio.sleep(delay)はコルーチンオブジェクトを返します。

コルーチンオブジェクト "completes"はどういう意味ですか?

yield from asyncio.sleep(delay)はメインプログラムにどのような値を提供しますか?

ありがとう。

11
Tim

次のコード行:

time.sleep(5)

...コードの実行を5秒間フリーズします。スリープ関数が呼び出し側に制御を返さなければアプリケーションは続行できないため、スリープ関数が5秒の昼寝を完了するまで、それ以上の計算や実行は行われません。これは同期プログラミングと呼ばれます。アプリケーションがそのフォーカスを変更し、データベース、Web API、またはこの場合はスリープ関数への呼び出しの結果を待つなどの待機期間に他のタスクを完了するメカニズムがない場合。同期プログラミングでは、アプリケーションが時間を管理したり、効率を上げるためにタスクを切り替えたりすることを期待していないため、イベントループは必要ありません。

次のコード:

asyncio.sleep(5)

...は非同期プログラミング用に設計されたasyncioライブラリの一部であり、イベントループには競合するタスクが割り当てられますで、すべてのタスクの状態を監視し、1から1に切り替えますアイドル/待機時間を最小限に抑えることを目的とした別の方法。これは、複数のプロセスが同時に実行されるスレッド処理ではありません。これは単にタスク実行を最適化するため、CPUがアイドル状態のままにならないため、全体の実行時間が大幅に短縮されます。

キーワードからのyield(python 3.5以降のawaitキーワードを使用できます)は、イベントループが1つのタスクを終了する機会がある瞬間です(例:クエリがデータベース呼び出しから返される間)イベントループが認識し、その間に実際に計算/実行できる別のタスクに焦点を当てます。

@ asyncio.coroutineデコレータ+ yield fromは、python 3.5以降と互換性がありますが、新しいキーワードasync defを使用して非同期コルーチンとawaitキーワードを定義し、イベントループが切り替えを評価できるようにします別のタスクは、3.5歳以上の場合の一般的で将来性のある方法です。

Asyncronous python頭を悩ませるのは非常に難しいことがありますが、過去数年のテーマに関する多くの優れたパイコンの講演があります-Youtubeで探して、もちろんドキュメントを読んでいるなら? ???

17
user3535074

yield fromは、3.5 awaitのpython3.4構文で、おそらくより意味があります。

「完了」とは、コルーチンのタスクが完了したことを意味します。

この場合、スリープタスクの実行中に他のタスクをコンピューターで処理できるように非同期スリープを使用する必要があります。他の並列タスク/コルーチンを実行している場合はより意味があります。

0
zython