Python の非同期処理を支える asyncio の核となるのが「イベントループ」です。本記事では、イベントループの役割と、以下3つの関数の違いと使い方について体系的に解説します。
get_running_loop()-
get_event_loop()(非推奨) new_event_loop()
Laravel や JavaScript の経験がある方にもわかりやすいように、対比を交えてお届けします。
🎯 イベントループとは?
イベントループは、非同期処理における「スケジューラ兼実行監視係」です。
- 非同期タスクの順序管理
- I/Oやタイマーなどのイベントを監視
- 発生したイベントに応じて対応処理を再開
🏃♀️ たとえ話
「駅構内の放送係」=各ホームの状態を監視し、電車が来たら案内する
🔍 各関数の役割と違い
✅ asyncio.get_running_loop()
現在実行中のイベントループを取得する。
非同期関数(async def)の内部でのみ使用可能。
async def main():
loop = asyncio.get_running_loop()
print(loop.time())
asyncio.run(main())
✅ asyncio.new_event_loop()
新しいイベントループオブジェクトを明示的に作成する関数。
同期関数内やスレッドで独自にループを作る際に使用される。
import asyncio
def setup_loop():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(async_task())
※ asyncio.run() の内部でもこの関数が使われています。
❌ asyncio.get_event_loop()(非推奨)
以前は「現在のイベントループを取得、なければ作成」する関数として使われていました。
しかし動作が曖昧でトラブルの原因になりやすく、Python 3.10以降では非推奨です。
# 非推奨:将来的にRuntimeErrorになる可能性あり
loop = asyncio.get_event_loop()
🆚 使い分け早見表
| 関数名 | 使う場所 | 用途・目的 | 推奨度 |
|---|---|---|---|
get_running_loop() |
async def 内 |
実行中のループを取得(最安全) | ✅ 高 |
new_event_loop() |
同期関数やスレッド | 新しいループの作成 | ✅ 高 |
get_event_loop() |
どこでも(曖昧) | 実行中 or 新規作成(非推奨) | ❌ 低 |
🧠 Laravel / JavaScriptとの対比
| 概念 | Laravel | JavaScript / Node.js | Python / asyncio |
|---|---|---|---|
| コンテキスト取得 | request() |
this, currentTarget
|
get_running_loop() |
| 非同期の基盤 | Queue / Job | Event loop | Event loop |
| 明示的なループ作成 | 非常にまれ | 自作しない | new_event_loop() |
🧪 使い分け例:簡単な比較コード
import asyncio
async def sample():
print("ループ:", asyncio.get_running_loop())
def sync_context():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(sample())
sync_context()
🙋♀️ よくある質問
Q1: いつ new_event_loop() を使うの?
- スレッドごとにイベントループを分けたいとき
-
asyncio.run()を使わずに手動でループを制御したいとき
Q2: get_event_loop() が非推奨の理由は?
- 同期関数内と非同期関数内で挙動が異なるため、予期せぬバグを生む
- Python 3.12以降では
RuntimeErrorを出す仕様に変更されつつある
✅ まとめ
-
get_running_loop():現在のイベントループを安全に取得(基本の選択肢) -
new_event_loop():手動でイベントループを作るときに使用 -
get_event_loop():使わないことを推奨
イベントループを正しく理解すると、FastAPI や LangChain、さらには非同期クローラーやチャットボット開発の基盤がしっかりします。非同期処理の世界に、勇気を持って踏み込んでいきましょう💪✨