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