Open1
async が付与されたメソッド内でのawait行の意味
async
を付与したメソッド定義内で await
を使用すると、その行は 非同期処理を待機します。具体的には、await
の後に続く非同期操作が完了するまで、その行の処理が停止し、他の非同期タスクが実行される可能性があります。
動作の詳細
-
非同期処理の待機:
-
await
は、非同期関数(async def
で定義された関数)や非同期操作(例:asyncio.Future
やasyncio.Task
)の結果を待機します。 - 処理が完了するまで、その行の実行は停止します。
-
-
イベントループの制御:
-
await
によって、現在のタスクが一時停止し、イベントループは他のタスクを実行する機会を得ます。 - 非同期プログラム全体の効率が向上します。
-
-
戻り値の取得:
-
await
の後に続く非同期操作が完了すると、その結果が返され、次の行の処理が再開されます。
-
await
の動作
例: 以下のコードでは、await asyncio.sleep(1)
によって1秒間待機します。その間、イベントループは他のタスクを実行できます。
import asyncio
async def task1():
print("Task 1: Start")
await asyncio.sleep(1) # 1秒間待機
print("Task 1: End")
async def task2():
print("Task 2: Start")
await asyncio.sleep(2) # 2秒間待機
print("Task 2: End")
async def main():
await asyncio.gather(task1(), task2()) # 並行して実行
asyncio.run(main())
実行結果:
Task 1: Start
Task 2: Start
Task 1: End
Task 2: End
コード例
以下のコードでは、await async_input(">>> ")
によって標準入力の読み取りが完了するまで待機します。その間、他の非同期タスク(例: メッセージ送信や受信)が実行される可能性があります。
async def input_name():
print("> Input your name.")
name = await async_input(">>> ") # 標準入力を非同期で待機
print(f"Hello, {name}.")
return name
注意点
-
await
は非同期関数内でのみ使用可能:-
await
を使用するには、関数がasync def
で定義されている必要があります。
-
-
ブロッキング操作を避ける:
-
await
を使うことで、ブロッキング操作を非同期化し、イベントループを効率的に動作させることができます。
-
結論
await
を使用すると、その行は非同期操作が完了するまで待機します。その間、イベントループは他のタスクを実行することができ、非同期プログラム全体の効率が向上します。これにより、複数のタスクを並行して実行することが可能になります。