イベントループとタスク
Pythonの非同期処理において、asyncio
モジュールは重要な役割を果たします。asyncio
の核となるのは「イベントループ」と「タスク」です。イベントループは、非同期タスクをスケジューリングし、それらのタスクが実行されるのを管理する役割を担います。ここでは、イベントループとタスクの基本操作について解説します。
イベントループの概要
イベントループは、複数の非同期タスクを管理し、次にどのタスクを実行すべきかを決定します。Pythonでは、asyncio.run()
やasyncio.get_event_loop()
を使ってイベントループを起動します。
import asyncio
async def say_hello():
print("Hello, world!")
await asyncio.sleep(1)
print("Goodbye, world!")
# イベントループの実行
asyncio.run(say_hello())
この例では、say_hello
という非同期関数を定義し、asyncio.run()
を使ってイベントループ上で実行しています。await asyncio.sleep(1)
は、1秒間タスクを待機させる非同期処理です。
タスクの作成
非同期処理の複数のタスクを並行して実行するには、asyncio.create_task()
を使ってタスクを生成します。複数のタスクを同時に管理することができます。
import asyncio
async def say_hello():
print("Hello, world!")
await asyncio.sleep(1)
print("Goodbye, world!")
async def main():
# 2つのタスクを並行して実行
task1 = asyncio.create_task(say_hello())
task2 = asyncio.create_task(say_hello())
# タスクの完了を待機
await task1
await task2
# イベントループの実行
asyncio.run(main())
ここでは、2つのsay_hello
タスクをasyncio.create_task()
で作成し、それらを並行して実行しています。イベントループはこれらのタスクを管理し、並行して処理を進めます。
イベントループの手動操作
高度な非同期処理では、イベントループを手動で操作することができます。asyncio.get_event_loop()
を使って現在のイベントループを取得し、タスクをスケジューリングして実行します。
import asyncio
async def say_hello():
print("Hello, world!")
await asyncio.sleep(1)
print("Goodbye, world!")
loop = asyncio.get_event_loop()
# タスクの作成
task = loop.create_task(say_hello())
# イベントループの実行
loop.run_until_complete(task)
# イベントループの終了
loop.close()
この例では、loop.create_task()
でタスクを作成し、loop.run_until_complete()
でそのタスクが完了するまでイベントループを実行しています。手動でイベントループを操作することで、より細かい制御が可能になります。
まとめ
Pythonの非同期処理において、イベントループとタスクは重要な役割を果たします。イベントループは複数の非同期タスクを効率的に管理し、タスクの実行をスケジューリングします。asyncio.run()
を使って簡単にイベントループを実行でき、複数のタスクをasyncio.create_task()
で並行して管理できます。また、get_event_loop()
を使ってイベントループを手動で操作することも可能です。これにより、より効率的な並行処理が実現します。