コルーチンは、値を生成し、外部から値を受け入れることができるジェネレーター関数です。コルーチンを使用する利点は、関数の実行を一時停止し、後で再開できることです。ネットワーク操作の場合、応答を待っている間、関数の実行を一時停止することは理にかなっています。時間を使用して、他のいくつかの関数を実行できます。
未来はPromise
JavaScript のオブジェクトのようなものです。これは、将来実現する価値のプレースホルダーのようなものです。上記の場合、ネットワークI / Oを待機している間、関数はコンテナーを提供できます。操作が完了すると、コンテナーは値をコンテナーに埋め込むことができます。futureオブジェクトを保持し、それが実行されると、そのオブジェクトのメソッドを呼び出して実際の結果を取得できます。
直接回答:あなたは必要ありませんensure_future
あなたが結果を必要としない場合。結果が必要な場合や、発生した例外を取得する場合に適しています。
追加のクレジット:最大ワーカー数を制御run_in_executor
するExecutor
インスタンスを選択して渡します。
説明とサンプルコード
最初の例では、コルーチンを使用しています。このwait
関数はコルーチンの束を取り、それらを結合します。したがってwait()
、すべてのコルーチンが使い果たされたときに完了します(すべての値を返す完了/終了)。
loop = get_event_loop() #
loop.run_until_complete(wait(coros))
このrun_until_complete
メソッドは、実行が終了するまでループが生きていることを確認します。この場合、非同期実行の結果が得られないことに注意してください。
2番目の例では、ensure_future
関数を使用してコルーチンをラップしTask
、一種のオブジェクトを返しますFuture
。コルーチンは、を呼び出すと、メインイベントループで実行されるようにスケジュールされますensure_future
。返されたfuture / taskオブジェクトにはまだ値がありませんが、時間の経過とともにネットワーク操作が完了すると、futureオブジェクトは操作の結果を保持します。
from asyncio import ensure_future
futures = []
for i in range(5):
futures.append(ensure_future(foo(i)))
loop = get_event_loop()
loop.run_until_complete(wait(futures))
したがって、この例では、単にコルーチンを使用する代わりにフューチャーを使用していることを除いて、同じことを行っています。
asyncio / coroutines / futuresの使用例を見てみましょう。
import asyncio
async def slow_operation():
await asyncio.sleep(1)
return 'Future is done!'
def got_result(future):
print(future.result())
# We have result, so let's stop
loop.stop()
loop = asyncio.get_event_loop()
task = loop.create_task(slow_operation())
task.add_done_callback(got_result)
# We run forever
loop.run_forever()
ここではcreate_task
、loop
オブジェクトに対してメソッドを使用しました。ensure_future
メインイベントループでタスクをスケジュールします。この方法により、選択したループでコルーチンをスケジュールできます。
またadd_done_callback
、タスクオブジェクトのメソッドを使用してコールバックを追加する概念も示しています。
A Task
はdone
、コルーチンが値を返すとき、例外を発生させるとき、またはキャンセルされるときです。これらのインシデントを確認する方法があります。
これらのトピックに関するブログ投稿をいくつか作成しました。
もちろん、公式マニュアルで詳細を見つけることができます:https : //docs.python.org/3/library/asyncio.html
ensure_future()
か?そして、結果が必要な場合は、単に使用できませんrun_until_complete(gather(coros))
か?