4.1 メソッド run()
モジュール asyncio には、非同期プログラムを作成して管理するための多くのメソッドや関数があります。asyncioモジュールの中で特に人気があり、よく使われるメソッドと関数をいくつか紹介します。
今日紹介する主な4つは以下のとおりです:
run()sleep()wait()gather()
では、詳細について説明します:
メソッド asyncio.run(coroutine)
このメソッドは非同期プログラムを実行するために使われます。特に、プログラムのメインスレッドのような同期コンテキストから非同期コードを実行したい場合に便利です。
メソッド asyncio.run() はメインのコルーチンを起動し、イベントループの生成と終了を管理します。このメソッドは自動的に新しいイベントループを作成し、コルーチンの実行が終了するとそれを終了します。
シグネチャ:
asyncio.run(async_function(), *, debug=False)
-
async_function: 実行したいコルーチンです。 -
debug: イベントループのデバッグモードを有効にするオプションのパラメータです。
使用例:
import asyncio
async def main():
print('Hello')
await asyncio.sleep(1)
print('World')
asyncio.run(main())
制約事項
他のイベントループ内から呼び出すことはできません:
asyncio.run() は同期コードからのみ呼び出すべきで、自分自身のイベントループを作成し終了します。既に存在するイベントループからこれを呼び出そうとするとエラーが発生します。
トップレベル専用:
このメソッドはプログラムのメインエントリーポイントを起動するためのもので、ネストされた非同期関数の呼び出しには使用すべきではありません。
4.2 メソッド sleep()
このメソッドは、他のコルーチンの実行をブロックせずに一定時間コルーチンの実行を停止したいときに使用されます。
メソッド asyncio.sleep() はasyncioモジュール内で、現在のコルーチンの実行を指定秒数中断するために使用されます。
このメソッドは、他のタスクを中断中にも実行できるため、同様のtime.sleep()メソッドとは異なります。このため、遅延や待機を必要とする非同期プログラムを記述するのに役立ちます。
シグネチャ:
asyncio.sleep(delay, result=None)
-
delay: 秒数で指定された遅延時間(小数点以下の数値も使用可能)。 -
result: 遅延後に返されるオプションの結果。
使用例:
import asyncio
async def main():
print('Start sleeping')
await asyncio.sleep(2)
print('Wake up')
asyncio.run(main())
この例では、コルーチンmainが2秒間一時停止され、その間に他のタスクを実行でき、その後"Wake up"を印刷して続行されます。
4.3 メソッド wait()
このメソッドは、複数の非同期操作の完了を待ちたいが、待機プロセスをより細かく制御したい場合に便利です。
メソッド asyncio.wait() はasyncioモジュール内で、複数の非同期タスクやコルーチンの完了を待機するために使用されます。すべてのタスクの完了、最初のタスクの完了、またはエラーで完了したタスクの完了を待つことができます。
gather()とは異なり、wait()メソッドは待機プロセスをより多く制御でき、タイムアウトと完了条件を指定できます。
メソッド asyncio.wait()の主な特徴
シグネチャ:
asyncio.wait(fs, *, timeout=None, return_when=ALL_COMPLETED)
ここで:
-
fs: 待機する必要のあるFutureオブジェクトやコルーチンのコレクション。 -
timeout: 最大待機時間を秒単位で指定するオプションのパラメータ。待機時間が切れた場合、その時点で完了したタスクを返します。 -
return_when: メソッドが終了すべき条件を示します。可能な値:-
ALL_COMPLETED: すべてのタスクが完了するとメソッドは結果を返します(デフォルト)。 -
FIRST_COMPLETED: 最初のタスクが完了するとメソッドは結果を返します。 -
FIRST_EXCEPTION: 例外で完了したタスクがあればメソッドは結果を返します。
-
複数のタスクやコルーチンの完了を待機します。待機時間と終了条件を指定可能です。
import asyncio
async def say(what, delay):
await asyncio.sleep(delay)
return what
async def main():
task1 = asyncio.create_task(say('hello', 1))
task2 = asyncio.create_task(say('world', 2))
done, pending = await asyncio.wait([task1, task2], timeout=1.5)
for task in done:
print(task.result())
asyncio.run(main())
上記の例では、各コルーチンsay()をcreate_task()メソッドの呼び出しを使ってTaskオブジェクトにラップし、その後これらのタスクのリストをwait()メソッドに渡します。Taskオブジェクトは、1つのタスクの完了を待つことなくコルーチンを並列で実行できます。
waitメソッドはタスクの実行を1.5秒間だけ待ち、それから実行されたタスクのタプルを返します。タプルの最初の値は完了したタスク(done)が含まれ、2番目はまだ実行中のタスク(pending)が含まれます。
4.4 メソッド gather()
このメソッドは、複数の非同期操作を並行して開始し、その結果をリストとして取得したい場合に特に便利です。
メソッド asyncio.gather() はasyncioモジュール内で、複数の非同期タスクを並行して実行し、その結果をリストとして返すために使用されます。コルーチンやタスクをグループ化し、その完了を待つのに便利な方法です。
メソッド asyncio.gather()の主な特徴
シグネチャ:
asyncio.gather(*coros_or_futures, return_exceptions=False)
ここで:
-
coros_or_futures: 実行すべきコルーチンやFutureオブジェクト。 -
return_exceptions: 例外を結果として返すかどうかを示すブール値。デフォルトではFalse。
使用例:
import asyncio
async def say_after(delay, what):
await asyncio.sleep(delay)
return what
async def main():
results = await asyncio.gather(
say_after(1, 'hello'),
say_after(2, 'world')
)
print(results)
asyncio.run(main())
この例は、asyncio.gatherがどのように複数のタスクを並行して実行し、それぞれ異なる遅延を持つかを示しています。すべてのタスクの結果はリストとして返されます。waitとは異なり、gatherは単にタスクの完了を待つだけでなく、すべてのコルーチンの結果を収集するので、各タスクの実行結果が重要な場合に便利です。
GO TO FULL VERSION