Open1
python3 asyncioライブラリとは
asyncio
ライブラリは、Python 標準ライブラリに含まれるモジュールで、非同期プログラミングをサポートするためのツールを提供します。これにより、I/O操作や並行処理を効率的に実行できるようになります。
主な機能
-
非同期タスクの管理:
-
asyncio
は非同期タスクを作成し、それらを並行して実行するための仕組みを提供します。 - 非同期タスクは
async def
で定義され、await
を使って他の非同期操作を待機します。
-
-
イベントループ:
-
asyncio
の中心的な概念は イベントループ です。イベントループは非同期タスクをスケジュールし、実行を管理します。 - イベントループは
asyncio.run()
やasyncio.get_event_loop()
を使って開始します。
-
-
非同期 I/O:
- ファイル操作、ネットワーク通信、標準入力/出力などのブロッキング操作を非同期的に実行できます。
- これにより、複数のタスクを効率的に並行実行できます。
-
同期コードの非同期化:
-
.run_in_executor
を使って、同期的なブロッキングコードを非同期タスクとして実行できます。
-
-
同期的な並行処理:
-
asyncio.gather()
やasyncio.create_task()
を使って複数の非同期タスクを並行して実行できます。
-
使用例
以下は、asyncio
を使った基本的な非同期プログラムの例です。
非同期タスクの作成と実行
import asyncio
async def say_hello():
print("Hello!")
await asyncio.sleep(1) # 非同期で1秒待機
print("Goodbye!")
async def main():
await say_hello() # 非同期タスクを実行
asyncio.run(main()) # イベントループを開始
複数タスクの並行実行
import asyncio
async def task1():
print("Task 1 started")
await asyncio.sleep(2)
print("Task 1 finished")
async def task2():
print("Task 2 started")
await asyncio.sleep(1)
print("Task 2 finished")
async def main():
await asyncio.gather(task1(), task2()) # 並行して実行
asyncio.run(main())
非同期 I/O
以下は、非同期で標準入力を読み取る例です。
import asyncio
import sys
async def async_input(prompt=""):
print(prompt, end="", flush=True)
return await asyncio.get_event_loop().run_in_executor(None, lambda: sys.stdin.readline().strip())
async def main():
name = await async_input("Enter your name: ")
print(f"Hello, {name}!")
asyncio.run(main())
主な関数とクラス
-
イベントループ関連:
-
asyncio.run(coro)
: 非同期プログラムを実行するための簡易的な方法。 -
asyncio.get_event_loop()
: 現在のイベントループを取得。
-
-
タスク管理:
-
asyncio.create_task(coro)
: 非同期タスクを作成。 -
asyncio.gather(*coros)
: 複数の非同期タスクを並行して実行。
-
-
非同期 I/O:
-
asyncio.Queue
: 非同期キューを提供。 -
.run_in_executor
: 同期コードを非同期化。
-
利用シーン
-
ネットワーク通信:
- 非同期でソケット通信を行うチャットアプリやサーバー。
-
Webクローリング:
- 非同期で複数の URL にアクセスしてデータを収集。
-
非同期 I/O:
- ファイル操作や標準入力/出力を効率的に処理。
結論
asyncio
は、非同期プログラミングを簡単に実現するための強力なツールです。イベントループを中心に、非同期タスクや I/O 操作を効率的に管理できるため、並行処理が必要なアプリケーション(例: チャットアプリ、Webクローラーなど)で広く利用されています。