非同期処理 python

Pythonで非同期処理を行うには、標準ライブラリであるasyncioを使うのが一般的です。これにより、I/O操作やネットワーク通信などの遅延が発生する処理を非同期で実行することで、プログラムのパフォーマンスを向上させることができます。

以下に、基本的な非同期処理の例を示します。

基本的な非同期処理の例

1. asyncioを使用した非同期関数

python
import asyncio async def say_hello(): print("Hello") await asyncio.sleep(1) # 非同期で1秒待つ print("World") async def main(): await say_hello() # イベントループを実行 asyncio.run(main())

この例では、say_hello関数が非同期関数として定義されています。await asyncio.sleep(1)は非同期で1秒待つ操作です。このようにして、I/O操作などの遅延が発生する部分を非同期で処理することができます。

2. 複数の非同期タスクの実行

複数の非同期タスクを同時に実行する場合は、以下のようにします。

python
import asyncio async def task(name, delay): print(f"Task {name} started") await asyncio.sleep(delay) print(f"Task {name} finished") async def main(): # タスクを作成 tasks = [ task("A", 2), task("B", 1), task("C", 3) ] # タスクを並列実行 await asyncio.gather(*tasks) # イベントループを実行 asyncio.run(main())

この例では、3つの非同期タスクを並列に実行しています。asyncio.gatherを使用すると、複数のタスクを並列に実行し、すべてのタスクが完了するのを待つことができます。

3. 非同期でのHTTPリクエスト

非同期HTTPリクエストを行うには、aiohttpライブラリを使用します。以下は、非同期で複数のHTTPリクエストを実行する例です。

まず、aiohttpをインストールします。

sh
pip install aiohttp

次に、非同期HTTPリクエストのコードを示します。

python
import asyncio import aiohttp async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): urls = [ "https://example.com", "https://httpbin.org/get", "https://jsonplaceholder.typicode.com/posts" ] async with aiohttp.ClientSession() as session: tasks = [fetch(session, url) for url in urls] responses = await asyncio.gather(*tasks) for i, response in enumerate(responses): print(f"Response {i + 1}:n{response[:100]}...") # 先頭100文字を表示 # イベントループを実行 asyncio.run(main())

この例では、aiohttp.ClientSessionを使って非同期HTTPリクエストを実行しています。asyncio.gatherを使って複数のリクエストを並列に実行し、各レスポンスを取得しています。

まとめ

Pythonで非同期処理を行うための基本的な方法を紹介しました。asyncioを使うことで、I/O操作やネットワーク通信などの遅延が発生する処理を非同期で実行し、プログラムのパフォーマンスを向上させることができます。さらに、aiohttpを使うことで、非同期でHTTPリクエストを実行することができます。これらの技術を使って、効率的な非同期プログラムを作成しましょう。

未分類

Posted by ぼっち