Pythonにおける非同期処理
この記事ではPythonにおける非同期処理について説明します。
Pythonのasync/awaitやasyncioモジュールの基本的な使い方のコードサンプルを学べます。
YouTube Video
Pythonにおける非同期処理
Python の非同期処理は、ファイルの読み書きやネットワーク通信などの時間のかかる I/O 操作を効率的に扱うための仕組みです。同期処理では一つの処理が終わるまで次の実行が止まってしまいますが、非同期処理を使うことで 待ち時間の間に別のタスクを進めることができます。Pythonでは、非同期処理を行うためにasyncioモジュールが提供されています。ここでは、その基本要素と使い方を順を追って解説します。
基本構文
非同期処理の中心になるのが コルーチン と呼ばれる関数です。async関数は非同期関数を定義し、awaitはその関数内で非同期タスクを待機する際に使用します。
1import asyncio
2
3async def say_hello():
4 print("Hello")
5 await asyncio.sleep(1)
6 print("World")
7
8if __name__ == "__main__":
9 # Execute asynchronous task
10 asyncio.run(say_hello())- 上記のコードでは、
say_hello関数が非同期処理として定義されています。sleep()によって1秒待機している間、他の非同期タスクが実行される可能性があります。
複数タスクの実行
asyncioモジュールのgather関数を使用すると、複数のタスクを同時に実行することができます。
1import asyncio
2
3async def task1():
4 print("Task 1 started")
5 await asyncio.sleep(2)
6 print("Task 1 completed")
7
8async def task2():
9 print("Task 2 started")
10 await asyncio.sleep(1)
11 print("Task 2 completed")
12
13async def main():
14 await asyncio.gather(task1(), task2())
15
16if __name__ == "__main__":
17 asyncio.run(main())- この例では、
task1とtask2が並行して実行されます。結果として、2つのタスクのうち、task2が先に完了しますが、全体の実行時間は最長のタスクの実行時間となります。
エラーハンドリング
非同期処理でも、エラーハンドリングは重要です。通常のtry-except構文を使用して、エラーをキャッチし処理できます。
1import asyncio
2
3async def faulty_task():
4 raise Exception("An error occurred")
5
6async def main():
7 try:
8 await faulty_task()
9 except Exception as e:
10 print(f"Caught an error: {e}")
11
12if __name__ == "__main__":
13 asyncio.run(main())- このコードは、非同期関数内で発生した例外を
try-exceptで捕捉し、安全にエラーメッセージを処理する方法を示しています。faulty_taskの例外がmain内でキャッチされ、適切に出力されます。
まとめ
Python の非同期処理は、async / await と asyncio を使って I/O 待ちの間に他のタスクを並行実行し、効率的に処理を進められる仕組みです。複数タスクの同時実行や、非同期 I/O などを活用することで、パフォーマンスを大きく向上できます。また、通常の try-except と同様にエラー処理を行えるため、安全に非同期コードを運用できます。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。