Python asyncioのgatherとwaitの使い方と違い

この記事では、Pythonの非同期プログラミングにおいて、`asyncio.gather()`と`asyncio.wait()`の使い方とそれらの違いについて詳しく解説します。具体的なコード例、その詳細な解説、さらには応用例も含めてご紹介します。

目次

非同期プログラミングとは

非同期プログラミングとは、複数のタスクを並行して効率よく処理するためのプログラミング手法の一つです。Pythonでは、`asyncio`ライブラリを使うことで、非同期プログラミングが容易に行えます。

なぜ非同期処理が必要なのか

非同期処理が必要な理由は主に2つあります。

  • IOバウンド処理(データベースの読み書き、API呼び出し等)を効率よく行うため
  • CPUバウンド処理(計算処理など)とIOバウンド処理を適切にバランスさせるため

これにより、プログラム全体のパフォーマンスが向上します。

asyncio.gather()の使い方

基本的な使い方

`sCode`
import asyncio

async def task_one():
print(“Task One is starting”)
await asyncio.sleep(2)
print(“Task One is completed”)

async def task_two():
print(“Task Two is starting”)
await asyncio.sleep(1)
print(“Task Two is completed”)

async def main():
await asyncio.gather(task_one(), task_two())

# コードを実行
asyncio.run(main())

コードの詳細解説

このコードでは、`task_one()`と`task_two()`という2つの非同期関数を定義しています。そして、`main()`関数内で`asyncio.gather()`を用いて両方のタスクを並行して実行しています。

asyncio.wait()の使い方

基本的な使い方

`sCode`
import asyncio

async def task_one():
print(“Task One is starting”)
await asyncio.sleep(2)
print(“Task One is completed”)

async def task_two():
print(“Task Two is starting”)
await asyncio.sleep(1)
print(“Task Two is completed”)

async def main():
done, pending = await asyncio.wait([task_one(), task_two()])

# コードを実行
asyncio.run(main())

コードの詳細解説

この例では、`asyncio.wait()`を使って非同期タスクを並行して実行しています。`asyncio.wait()`は、渡されたすべての非同期タスクが完了すると`done`と`pending`の2つのセットを返します。

gatherとwaitの違い

基本的に`gather`と`wait`は似たような動作をしますが、以下のような違いがあります。

応用例1: gatherで戻り値を取得

`sCode`
import asyncio

async def sum(a, b):
await asyncio.sleep(1)
return a + b

async def main():
result = await asyncio.gather(sum(1, 2), sum(3, 4))
print(f”Results: {result}”)

asyncio.run(main())