地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Python】asyncio.Semaphore

asyncio.Semaphore は、非同期プログラムでのリソースの制限を管理するために使用される同期プリミティブです。セマフォは、リソースの同時アクセス数を制限するために用いられます。asyncio.Semaphore は非同期タスクがリソースを安全に共有できるようにするため、特にIO操作や並行処理が多い場合に役立ちます。

基本的な概念

セマフォは、指定された数の許可(「トークン」)を保持しており、リソースを使用するにはトークンを取得する必要があります。リソースを使用し終わると、そのトークンを返却します。これにより、同時にリソースを使用できるタスクの数が制限されます。

使用方法

import asyncio

# セマフォの作成(最大同時実行数は3)
semaphore = asyncio.Semaphore(3)

async def access_resource(task_id):
    async with semaphore:
        print(f"Task {task_id} is accessing the resource")
        await asyncio.sleep(2)  # リソースにアクセス中(非同期操作)
        print(f"Task {task_id} has finished using the resource")

async def main():
    # タスクを並行して実行
    tasks = [access_resource(i) for i in range(5)]
    await asyncio.gather(*tasks)

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