Google Colabで「RuntimeError: This event loop is already running」と出力される場合の対処について書きます。
前回、Pythonでasyncとawaitキーワードを使用して非同期関数と非同期処理を行うという記事を公開しましたが、公開したコードをGoogle Colaboratory(略称: Google Colab)で実行します。
■今回の環境(Python)
今回のPythonはバージョン3.10.11を用いる。(Google Colaboratory)
■コード
import asyncio # 非同期関数 async def print_message(message): print("処理を開始します") await asyncio.sleep(1) # 非同期に1秒待機 print(message) print("処理が完了しました") # イベントループの作成 loop = asyncio.get_event_loop() # 非同期関数の実行 loop.run_until_complete(print_message("Hello, World!")) # イベントループの終了 loop.close()
■エラー
--------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) in () 12 13 # 非同期関数の実行 ---> 14 loop.run_until_complete(print_message("Hello, World!")) 15 16 # イベントループの終了 1 frames /usr/lib/python3.10/asyncio/base_events.py in _check_running(self) 582 def _check_running(self): 583 if self.is_running(): --> 584 raise RuntimeError('This event loop is already running') 585 if events._get_running_loop() is not None: 586 raise RuntimeError( RuntimeError: This event loop is already running
実行すると、上記のエラーが出力されます。
■修正されたコード
import asyncio import nest_asyncio nest_asyncio.apply() # 非同期関数 async def print_message(message): print("処理を開始します") await asyncio.sleep(1) # 非同期に1秒待機 print(message) print("処理が完了しました") # イベントループの作成 loop = asyncio.get_event_loop() # 非同期関数の実行 asyncio.run(print_message("Hello, World!"))
修正点:
loop.run_until_complete()をasyncio.run()に置き換えています。asyncio.run()はPython 3.7以降で利用可能な関数で、新しいイベントループを自動的に作成し、非同期関数を実行して終了するため、エラーが発生しません。なお、nest_asyncioは今回の場合ではインストール不要でimportで呼び出すだけでよい。
loop.close()の行を削除しています。asyncio.run()を使用すると、イベントループが自動的にクローズされるため、明示的なクローズは必要ありません。
修正後のコードを実行すると、正常に非同期関数が実行されます。
■実行・検証
このコードセルを保存し、Google Colaboratory上で、セルを実行してみます。
実行してみると、「RuntimeError: This event loop is already running」というエラーは発生せず、正常に非同期関数が実行されていることを確認できました。
コメント