7.1 タスクの作成
Task
クラスはasyncioモジュールでコルーチンの実行を管理するために使用されるんだ。タスク(Tasks)
はコルーチンのラッパーで、実行の管理や状態の追跡ができる。Task
クラスを使うと、イベントループを通じてコルーチンを並行して走らせることができるよ。
クラスTask
の主なメソッド
Task
クラスはコルーチンのラッパーで、以下のような追加機能があるんだ:
コルーチンの実行管理:
タスクを使うとコルーチンの実行を簡単に管理でき、状態をコントロールしたり、結果を取得することができる。
タスクのキャンセル:
タスクをキャンセルできるので、Task
は長時間の操作を管理するのに役立つよ。完了する前に停止が必要な場合もあるからね。
コールバック:
タスクはコールバックを追加する機能があって、タスクが終わったときに追加の処理を実行できるんだ。
タスクの作成:
タスクはasyncio.create_task(coroutine)
関数やloop.create_task(coroutine)
メソッドで作成して、コルーチンの実行をスケジュールするんだ。
import asyncio
async def say_hello():
print("Hello")
await asyncio.sleep(1)
print("World")
async def main():
task = asyncio.create_task(say_hello())
await task
asyncio.run(main())
7.2 主なメソッド
メソッド Task.cancel()
:
タスクのキャンセルを要求するんだ。もしタスクがまだ完了していない場合、CancelledError
例外と共に完了する。
小さなプログラムを書いて、これを示してみよう。
ただ10秒待つだけの非同期タスクを作成する
それを
Task
オブジェクトでラップするタスク(Task)が実行を開始するために1秒待つ
タスクをキャンセルする -
task.cancel()
-
もしその後タスク(Task)の完了を
await
演算子で待とうとすると、CancelledError
例外が発生するよ。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(10))
await asyncio.sleep(1)
task.cancel()
try:
await task
except asyncio.CancelledError:
print("Task was cancelled")
asyncio.run(main())
メソッド Task.result()
:
タスクの実行結果を返す。もしタスクが例外で終了した場合は、result()
の呼び出し時にその例外が発生する。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
result = await task
print(result) # Output: Completed
asyncio.run(main())
この場合、追加のコードを書く必要がなかったよ。await
演算子はTask
オブジェクトの使い方を理解しているからね。タスクの実行後、自動的にresult()
メソッドを呼び出して結果を返してくれる。
メソッド Task.exception()
:
タスクによって発生した例外を返すんだ。例外がなければNone
を返す。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(1))
try:
result = await task
except Exception as e:
print(f"Task failed with exception: {e}")
asyncio.run(main())
追加のコードを書く必要はないよ。もしタスクで例外が発生したら、await
演算子がexception()
メソッドを呼び出してくれるから。
メソッド Task.add_done_callback(callback)
:
タスクが完了したときに呼び出されるコールバック(callback)
を追加する。
import asyncio
def callback(future):
print("Task completed")
async def main():
task = asyncio.create_task(asyncio.sleep(1))
task.add_done_callback(callback)
await task
asyncio.run(main())
タスクが終了したときに自動的に呼び出される関数を追加できるんだ。この方法でコードを非常に柔軟にすることができる。さらに、複数の関数を追加できるし、どんなタスクにも追加できるよ。
メソッド Task.done()
:
タスクが完了していればTrue
を返す(成功、エラー、またはキャンセルされた場合)。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(1))
await asyncio.sleep(1.5)
print(task.done()) # Output: True
asyncio.run(main())
メソッドdone()
を使うと、タスクが正常に完了したかどうかを確認できるよ。というのも、完了したか、キャンセルされたか、どちらかだからね。もし例外が発生した場合は、形式上タスクは完了していないかもしれないけど、キャンセルされていないこともある。つまり、タスクをキャンセルした場合(cancel)
、メソッドはFalse
を返すよ。そうじゃない場合はTrue
を返す。
GO TO FULL VERSION