コルーチンとイベントループ
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 foreverasyncio.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 coroutineasyncioのデバッグモード
デバッグモードを有効にすると、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フィードバックを取得できます。ローカル設定は不要です。