web-dev-qa-db-ja.com

loop.create_task、asyncio.async / ensure_future、Taskの違いは何ですか?

いくつかのasyncio関数に少し混乱しています。コルーチンをスケジュールする BaseEventLoop.create_task(coro) 関数があるようです。 _create_task_のドキュメントには、その新しい関数と記載されているため、互換性のために asyncio.async(coro) を使用する必要があります。これは、ドキュメントを再度参照すると asyncio.ensure_future(coro) コルーチンの実行を再度スケジュールします。

その間、私は Task(coro) を使用してコルーチンの実行をスケジュールしていますが、それもうまく機能しているようです。それで、これらすべての違いは何ですか?

31
Elektito

お気づきのとおり、これらはすべて同じことを行います。

Python> = 3.5では、asyncがキーワードになったため、asyncio.asyncasyncio.ensure_futureに置き換える必要がありました [1]

create_taskの存在理由 [2]

サードパーティのイベントループは、相互運用性のためにTaskの独自のサブクラスを使用できます。この場合、結果のタイプはTaskのサブクラスです。

また、イベントループによって「タスク」の作成方法が異なる可能性があるため、Taskを直接作成しないことも意味します。

編集

別の重要なの違いは、コルーチンを受け入れることに加えて、ensure_futureは待機可能なオブジェクトも受け入れることです。一方、create_taskはコルーチンのみを受け入れます。

22
Jashandeep Sohi