Open1

async が付与されたメソッド内でのawait行の意味

pdfpdf

async を付与したメソッド定義内で await を使用すると、その行は 非同期処理を待機します。具体的には、await の後に続く非同期操作が完了するまで、その行の処理が停止し、他の非同期タスクが実行される可能性があります。


動作の詳細

  1. 非同期処理の待機:

    • await は、非同期関数(async def で定義された関数)や非同期操作(例: asyncio.Futureasyncio.Task)の結果を待機します。
    • 処理が完了するまで、その行の実行は停止します。
  2. イベントループの制御:

    • await によって、現在のタスクが一時停止し、イベントループは他のタスクを実行する機会を得ます。
    • 非同期プログラム全体の効率が向上します。
  3. 戻り値の取得:

    • 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

注意点

  1. await は非同期関数内でのみ使用可能:

    • await を使用するには、関数が async def で定義されている必要があります。
  2. ブロッキング操作を避ける:

    • await を使うことで、ブロッキング操作を非同期化し、イベントループを効率的に動作させることができます。

結論

await を使用すると、その行は非同期操作が完了するまで待機します。その間、イベントループは他のタスクを実行することができ、非同期プログラム全体の効率が向上します。これにより、複数のタスクを並行して実行することが可能になります。