Open1
Python3の`asyncio`とは?
asyncio
とは?
Pythonのasyncio
は、Python 標準ライブラリに含まれる非同期プログラミングのためのモジュールです。非同期 I/O 操作や並行処理を効率的に実現するためのツールを提供します。
まとめ
-
asyncio
は、Python 標準ライブラリが提供する非同期プログラミングのためのモジュールです。 - イベントループを中心に、非同期タスクや I/O 操作を効率的に管理します。
-
async def
とawait
を使用して、シンプルかつ効率的な非同期コードを記述できます。
asyncio
を活用することで、ネットワーク通信や並行処理を効率的に実現できます。
主な特徴
-
非同期プログラミングのサポート:
-
asyncio
は、非同期タスクをスケジュールし、並行して実行するためのイベントループを提供します。 -
async def
やawait
を使用して非同期関数を定義・実行できます。
-
-
非同期 I/O 操作:
- ネットワーク通信やファイル操作など、ブロッキング操作を非同期で実行できます。
- 例: ソケット通信、HTTPリクエスト、データベースクエリなど。
-
イベントループ:
- イベントループは、非同期タスクや I/O 操作をスケジュールし、効率的に実行します。
-
asyncio.run()
を使用してイベントループを開始します。
-
タスクの並行実行:
- 複数の非同期タスクを並行して実行できます。
-
asyncio.gather()
やasyncio.create_task()
を使用してタスクをスケジュールします。
-
高レベルと低レベルの API:
- 高レベル API:
asyncio.run()
,asyncio.gather()
,asyncio.Queue()
など。 - 低レベル API: カスタムイベントループやプロトコルの実装。
- 高レベル API:
基本的な使い方
非同期関数の定義と実行
import asyncio
async def say_hello():
print("Hello, World!")
await asyncio.sleep(1) # 非同期で1秒待機
print("Goodbye, World!")
asyncio.run(say_hello()) # イベントループを開始して非同期関数を実行
複数タスクの並行実行
import asyncio
async def task1():
for i in range(3):
print(f"Task 1 - Step {i}")
await asyncio.sleep(1)
async def task2():
for i in range(3):
print(f"Task 2 - Step {i}")
await asyncio.sleep(1.5)
async def main():
await asyncio.gather(task1(), task2()) # 並行してタスクを実行
asyncio.run(main())
主な構成要素
-
イベントループ:
- 非同期タスクや I/O 操作をスケジュールし、実行する仕組み。
-
asyncio.get_event_loop()
で現在のイベントループを取得。
-
非同期関数 (
async def
):- 非同期処理を定義するための関数。
-
await
を使用して他の非同期処理を待機できます。
-
タスク (
asyncio.Task
):- イベントループで実行される非同期タスク。
-
asyncio.create_task()
を使用してタスクを作成。
-
非同期キュー (
asyncio.Queue
):- タスク間でデータをやり取りするための非同期キュー。
-
非同期 I/O:
- ソケット通信やファイル操作を非同期で実行。
代表的な関数とクラス
-
asyncio.run(coro)
:- イベントループを開始してコルーチンを実行します。
-
asyncio.gather(*coros)
:- 複数のコルーチンを並行して実行します。
-
asyncio.create_task(coro)
:- コルーチンをタスクとしてスケジュールします。
-
asyncio.Queue()
:- 非同期タスク間でデータをやり取りするためのキュー。
-
asyncio.sleep(seconds)
:- 非同期で指定した秒数だけ待機します。
asyncio
を使うメリット
-
効率的な並行処理:
- 非同期 I/O を利用することで、ブロッキング操作を回避し、効率的にタスクを実行できます。
-
シンプルなコード:
-
async
とawait
を使用することで、非同期処理を直感的に記述できます。
-
-
スケーラビリティ:
- 多数の I/O 操作を効率的に処理できるため、ネットワーク通信やデータベース操作に適しています。