実際の情報:
この目的のために、Python 3.7以降、asyncio.create_task(coro)
高水準関数が追加されました。
代わりに、coroutimeからタスクを作成する他の方法を使用してください。ただし、任意のawaitableからタスクを作成する必要がある場合は、を使用する必要がありますasyncio.ensure_future(obj)
。
古い情報:
ensure_future
対 create_task
ensure_future
作成するための方法であるTask
からcoroutine
。引数に基づいてさまざまな方法でタスクを作成します(create_task
コルーチンや未来のようなオブジェクトの使用を含む)。
create_task
はの抽象メソッドですAbstractEventLoop
。異なるイベントループは、この関数を異なる方法で実装できます。
ensure_future
タスクの作成に使用する必要があります。create_task
独自のイベントループタイプを実装する場合にのみ必要になります。
更新:
@ bj0はこのトピックに関するGuidoの回答を指摘しました:
ポイントはensure_future()
、コルーチンまたはa Future
(後者にはTask
のサブクラスであるためが含まれる)のいずれかであり、Future
その上でのみ定義されているメソッドを呼び出すことができるようにする場合ですFuture
(おそらく、有用な例ですcancel()
)。既にFuture
(またはTask
)の場合、これは何もしません。コルーチンの場合は、でラップしTask
ます。
コルーチンがあり、それをスケジュールしたい場合は、使用する正しいAPIはcreate_task()
です。呼び出す必要がensure_future()
あるのは、コルーチンまたはaのいずれかを受け入れるAPI(ほとんどのasyncio独自のAPIなど)を提供Future
していて、を持っていることを必要とする何かを実行する必要があるときだけですFuture
。
以降:
結局のところ、これはensure_future()
めったに必要とされない機能の部分の名前としては適切にあいまいであると私はまだ信じています。コルーチンからタスクを作成するときは、適切な名前のを使用する必要があります
loop.create_task()
。多分それのためのエイリアスがあるはず
asyncio.create_task()
ですか?
それは私には驚くべきことです。私がensure_future
ずっと使用する主な動機は、ループのメンバーと比較してより高レベルの関数であることでしたcreate_task
(ディスカッションには、asyncio.spawn
またはのようないくつかのアイデアが含まれていますasyncio.create_task
)。
また、私の意見でAwaitable
は、コルーチンだけではなく、何でも処理できる汎用関数を使用するのが非常に便利だと指摘できます。
ただし、Guidoの答えは明確です。「コルーチンからタスクを作成するときは、適切な名前を付けてくださいloop.create_task()
」
コルーチンをタスクにラップする必要があるのはいつですか?
タスクにコルーチンをラップする-このコルーチンを「バックグラウンドで」開始する方法です。次に例を示します。
import asyncio
async def msg(text):
await asyncio.sleep(0.1)
print(text)
async def long_operation():
print('long_operation started')
await asyncio.sleep(3)
print('long_operation finished')
async def main():
await msg('first')
# Now you want to start long_operation, but you don't want to wait it finised:
# long_operation should be started, but second msg should be printed immediately.
# Create task to do so:
task = asyncio.ensure_future(long_operation())
await msg('second')
# Now, when you want, you can await task finised:
await task
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
出力:
first
long_operation started
second
long_operation finished
違いを感じるasyncio.ensure_future(long_operation())
だけで交換できawait long_operation()
ます。
create_task
通常必要のないタスクオブジェクトが本当に必要な場合は、github.com / python / asyncio / issues / 477#issuecomment-268709555を使用する必要があります。