サーバレス練習帳

着眼大局着手小局

pythonの非同期処理

https://note.com/cz_investment_ch/n/na3fa924ecf92

このコードが参考になるかな。
dev.classmethod.jp

・・・ということで、ChatGPTに聞いてみた。

Pythonで非同期処理を行い、複数のタスクから最初に終了したものの結果で処理を終了させたい場合は、asyncioライブラリを使用してasyncio.wait関数のreturn_whenパラメータをasyncio.FIRST_COMPLETEDに設定すると実現できます。
以下は、asyncioを使って3つの非同期タスクを実行し、どれか一つが終わった時点で全体の処理を終了させる例です。
import asyncio

# 非同期で実行するタスク
async def task(name, seconds):
await asyncio.sleep(seconds)
print(f"{name} finished after {seconds} seconds")
return name

# 最初に終了したタスクの結果で処理を終了する関数
async def main():
# それぞれ異なる時間を待機するタスクを定義
t1 = task("タスク1", 3)
t2 = task("タスク2", 1)
t3 = task("タスク3", 2)

# asyncio.waitで非同期にタスクを待つ
done, pending = await asyncio.wait(
{t1, t2, t3},
return_when=asyncio.FIRST_COMPLETED # 最初に終了したタスクを待つ
)

# 完了したタスクの情報を処理
for task in done:
result = await task
print(f"結果: {result}")

# 他のタスクをキャンセル
for task in pending:
task.cancel()

# 非同期処理を実行
asyncio.run(main())

このコードでは、異なる秒数で完了する3つのタスクを同時に開始します。asyncio.waitがFIRST_COMPLETEDで最初に完了したタスクを待ち、結果を出力した後、残りの未完了のタスクをキャンセルします。
注意: Python 3.7 以降でasyncio.run関数を使っています。それより前のバージョンを使っている場合は、イベントループを手動で管理する必要があります。また、非同期処理ではグローバル解釈ロック(GIL)による影響を受けにくいため、マルチスレッドに比べて効率的な場合がありますが、IOバウンド処理向けです。計算密度の高い処理でのパフォーマンス向上は見込めません。