0Pricing
Python Academy · レッスン

コルーチンとイベントループ

async def でコルーチンを定義し、asyncio.run() で実行します。

「コルーチンとイベントループ」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

並行性とは

Asyncioは協調的並行性を提供します。1つのスレッドが、多数のタスクのうち1つがI/O待ちになるたびにタスクを切り替えながら処理します。

# Traditional: blocking I/O holds the whole thread
# Asyncio: while waiting for I/O, run other coroutines

import asyncio

async def main():
    print("Hello")
    await asyncio.sleep(1)   # yield control
    print("World")

asyncio.run(main())

async def — コルーチン関数

async defで定義した関数はコルーチン関数です。これを呼び出すとコルーチンオブジェクトが返され、awaitするかスケジュールするまで実行されません。

import asyncio

async def greet(name):
    return f"Hello, {name}"

result = asyncio.run(greet("Alice"))
print(result)   # Hello, Alice

イベントループ

イベントループがコルーチンの実行を進めます。asyncio.run(coro)は新しいイベントループを作成し、コルーチンが完了するまで実行してからループを閉じます。

import asyncio

async def compute():
    await asyncio.sleep(0)
    return 42

value = asyncio.run(compute())
print(value)   # 42

# For advanced use:
loop = asyncio.new_event_loop()
result = loop.run_until_complete(compute())
loop.close()

awaitによる実行の一時停止

await exprは、expr(別のコルーチンまたはfuture)が完了するまで現在のコルーチンを一時停止します。その間、イベントループは他のタスクを実行します。

import asyncio

async def task(name, delay):
    print(f"{name} starting")
    await asyncio.sleep(delay)
    print(f"{name} done")

async def main():
    await task("A", 2)
    await task("B", 1)   # sequential here

asyncio.run(main())

asyncio.sleep()

asyncio.sleep(seconds)は、イベントループをブロックせずに、指定された時間だけ現在のコルーチンを一時停止します。

import asyncio

async def heartbeat():
    while True:
        print("ping")
        await asyncio.sleep(1)

# asyncio.run(heartbeat())  # runs forever

asyncio.run()のエントリーポイント

asyncio.run(coro)は、トップレベルで使う標準的なエントリーポイントです。実行中のイベントループ内から呼び出してはいけません。

import asyncio

async def main():
    print("running")

if __name__ == "__main__":
    asyncio.run(main())

イベントループ内かどうかの確認

asyncio.get_running_loop()を使うと、ループがすでに実行中かどうかを検出できます(実行中でなければRuntimeErrorが発生します)。

import asyncio

async def inner():
    loop = asyncio.get_running_loop()
    print(f"Loop: {loop}")

asyncio.run(inner())

ブロッキング処理の実行

loop.run_in_executor(None, func, *args)を使うと、CPUバウンド処理やブロッキングI/O処理をイベントループをブロックせずに実行できます。

import asyncio, time

def blocking():
    time.sleep(2)
    return "done"

async def main():
    loop = asyncio.get_event_loop()
    result = await loop.run_in_executor(None, blocking)
    print(result)

asyncio.run(main())

コルーチンの連鎖

コルーチンは他のコルーチンをawaitできるため、連鎖を構成できます。各レベルが完了するたびに、制御は連鎖を下へ進み、上へ戻ります。

import asyncio

async def fetch_data():
    await asyncio.sleep(1)
    return {"value": 42}

async def process():
    data = await fetch_data()
    return data["value"] * 2

async def main():
    result = await process()
    print(result)   # 84

asyncio.run(main())

コルーチンの識別

asyncio.iscoroutine(obj)またはasyncio.iscoroutinefunction(func)を使うと、実行時に非同期関数を調べられます。

import asyncio

async def my_coro():
    pass

print(asyncio.iscoroutinefunction(my_coro))   # True
coro = my_coro()
print(asyncio.iscoroutine(coro))              # True
coro.close()   # clean up the un-awaited coroutine

asyncioのデバッグモード

デバッグモードを有効にすると、awaitされていないコルーチン、遅いコールバック、その他の問題を検出できます。PYTHONASYNCIODEBUG=1を設定するか、asyncio.runにdebug=Trueを渡してください。

import asyncio

async def main():
    pass

asyncio.run(main(), debug=True)

# Or:
# PYTHONASYNCIODEBUG=1 python script.py

クイックチェック

asyncio.run(coro)は何をしますか。

まとめ

async defでコルーチンを定義し、asyncio.run()で実行し、awaitで一時停止します。イベントループはコルーチンを協調的にスケジュールし、1つがI/Oを待っている間に他のコルーチンを実行します。

よくある質問

「コルーチンとイベントループ」レッスンは無料ですか?

はい。「コルーチンとイベントループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「コルーチンとイベントループ」で何を学びますか?

async def でコルーチンを定義し、asyncio.run() で実行します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「コルーチンとイベントループ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コルーチンとイベントループ
  2. await、タスク、ギャザリング
  3. 非同期コンテキストマネージャーとイテレーター
  4. 本番環境での非同期 I/O パターン
← Python Academyに戻る