非同期タスクは、asyncio コルーチンを独立してスケジュールして実行するオブジェクトです。これは、asyncio プログラムがクエリを実行してコルーチンと対話するために使用できる、ディスパッチされたコルーチンへのハンドルを提供します。
タスクはコルーチンから作成されます。コルーチン オブジェクトを取得し、コルーチンをラップし、実行のスケジュールを設定し、コルーチンと対話するメソッドを提供します。タスクは独立して実行されます。これは、asyncio イベント ループでスケジュールされ、それを作成したコルーチンで何が起こったかに関係なく実行されることを意味します。これは、呼び出し元が完了するまで待つ必要があるコルーチンを直接実行する場合とは異なります。
asyncio.Task クラスは asyncio.Future クラスを拡張し、インスタンスは待機可能です。 Future は、最終的に到着する結果を表す下位クラスです。 Future クラスを拡張したクラスは、多くの場合、Future クラスと呼ばれます。
非同期タスクは待機可能であるため、コルーチンは await 式を使用してタスクの完了を待機できることを意味します。
... # wait for a task to be done await task
asyncio タスクとは何かがわかったので、作成方法を見てみましょう。
提供されたコルーチン インスタンスを使用してタスクを作成します。コルーチンは async def 式を使用して定義され、関数のように見えることを思い出してください。
# define a coroutine async def task_coroutine(): # ...
タスクはコルーチンでのみ作成およびスケジュールできます。タスクを作成してスケジュールするには、主に次の 2 つの方法があります。
高レベル API を使用してタスクを作成する (推奨)
タスクを作成する低レベル API の使用
asyncio.create_task() 関数を使用してタスクを作成できます。 asyncio.create_task() 関数は、コルーチン インスタンスとオプションのタスク名を受け入れ、asyncio.Task インスタンスを返します。
... # create a coroutine coro = task_coroutine() # create a task from a coroutine task = asyncio.create_task(coro)
これは、単一行で複合ステートメントを使用することで実現できます。
... # create a task from a coroutine task = asyncio.create_task(task_coroutine())
これにより、いくつかのことが行われます:
コルーチンを非同期タスク インスタンスにラップします。
現在のイベント ループで実行されるタスクをスケジュールします。
タスク インスタンスを返す
タスク インスタンスは破棄したり、メソッドを通じて操作したり、コルーチンによって待機したりできます。これは、asyncio プログラムでコルーチンからタスクを作成する場合に推奨される方法です。
低レベルの asyncio API を使用して、コルーチンからタスクを作成することもできます。
最初の方法は、asyncio.ensure_future() 関数を使用することです。この関数は、タスク、将来、またはコルーチンなどの将来に似たオブジェクトを受け取り、オプションでそれをスケジュールするためのループを受け取ります。ループが指定されていない場合は、現在のイベント ループでスケジュールされます。
この関数にコルーチンが提供されている場合、それはインスタンスにラップされて返されます。
... # create and schedule the task task = asyncio.ensure_future(task_coroutine())
タスクの作成とスケジュールに使用できるもう 1 つの低レベル関数は、loop.create_task() メソッドです。この関数には、コルーチンがタスクとして実行される特定のイベント ループへのアクセスが必要です。
asyncio.get_event_loop() 関数を通じて、asyncio プログラム内の現在のイベント ループのインスタンスを取得できます。これを使用して create_task() メソッドを呼び出し、Task インスタンスを作成し、実行をスケジュールできます。
... # get the current event loop loop = asyncio.get_event_loop() # create and schedule the task task = loop.create_task(task_coroutine())
タスクを作成した後のよくある質問は、いつ実行されるのかということです。
create_task() 関数を使用してコルーチンをタスクとして独立して実行するようにスケジュールできますが、すぐには実行されない場合があります。実際、イベント ループが実行されるまでタスクは実行されません。
他のすべてのコルーチンが実行されなくなり、タスクが実行される番になるまで、これは発生しません。
たとえば、タスクを作成してスケジュールするコルーチンを含む asyncio プログラムがある場合、スケジュールされたタスクは、タスクを作成した呼び出しコルーチンが一時停止されるまで実行されません。
これは、呼び出し側コルーチンがスリープすることを選択した場合、別のコルーチンまたはタスクを待機することを選択した場合、またはスケジュールされた新しいタスクを待機することを選択した場合に発生する可能性があります。
... # create a task from a coroutine task = asyncio.create_task(task_coroutine()) # await the task, allowing it to run await task
これで、タスクとは何か、そしてそれらをスケジュールする方法がわかりました。
以上がPython で非同期タスクを作成して実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。