0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python AsyncIO:`get_running_loop()` / `get_event_loop()` / `new_event_loop()` の違いと使い方

Posted at

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、さらには非同期クローラーやチャットボット開発の基盤がしっかりします。非同期処理の世界に、勇気を持って踏み込んでいきましょう💪✨


📚 参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?