Pythonでの非同期処理 – Pythonで始めるプログラミング

Pythonでの非同期処理 – Pythonで始めるプログラミング

非同期処理は、特に長時間実行されるタスクを効率的に処理したい場合に非常に役立ちます。Pythonのasyncioモジュール(外部リンク)を使用することで、簡単に非同期処理を実装できます。

非同期処理の基本

Pythonでは、asyncioライブラリを使用して非同期処理を行います。まず、イベントループを作成し、タスクを実行する必要があります。

import asyncio

async def say_hello():
    print("こんにちは!")
    await asyncio.sleep(1)
    print("さようなら!")

asyncio.run(say_hello())

上記のコードでは、非同期関数say_helloを定義し、それをイベントループで実行しています。awaitキーワードを使用して非同期で実行される部分を指定します。

応用例

次に、非同期処理のもう少し複雑な例を見てみましょう。複数のタスクを同時に実行することができます。

import asyncio

async def fetch_data(i):
    print(f"開始 {i}")
    await asyncio.sleep(2)
    print(f"終了 {i}")

async def main():
    tasks = [fetch_data(i) for i in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())

この例では、asyncio.gatherを使用して複数のタスクを同時に実行しています。fetch_data関数が5回並行して実行されます。

エラーハンドリング

非同期処理中にエラーが発生することがあります。そのため、適切にエラーハンドリングを行う必要があります。以下はその一例です。

import asyncio

async def risky_task(i):
    try:
        if i % 2 == 0:
            raise ValueError(f"エラー: {i}")
        print(f"成功 {i}")
    except ValueError as e:
        print(e)

async def main():
    tasks = [risky_task(i) for i in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())

このコードでは、risky_task関数内でValueErrorをキャッチし、エラーが発生しても他のタスクが影響を受けないようになっています。

実際の利用ケース

非同期処理は、例えばWebスクレイピングやAPIリクエストの際に非常に有効です。以下にWebスクレイピングの例を示します。

import aiohttp
import asyncio

async def fetch_content(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    urls = [
        "https://example.com",
        "https://example.org",
        "https://example.net",
    ]
    tasks = [fetch_content(url) for url in urls]
    contents = await asyncio.gather(*tasks)
    for content in contents:
        print(content)

asyncio.run(main())

この例では、aiohttpを使用して複数のURLから同時にコンテンツをフェッチしています。

「非同期処理を適切に利用することで、プログラムの効率が大幅に向上することが多いです。」

まとめ

Pythonでの非同期処理は、特に長時間実行されるタスクやI/Oバウンドの処理に非常に有効です。asyncioaiohttpなどのライブラリを活用することで、効率的なプログラムを作成することができます。ぜひ試してみてください。

コメントを残す