LoginSignup
7
6

More than 1 year has passed since last update.

Jupyter RuntimeErrorの対処方法 asyncio.run() cannot be called from a running event loop

Last updated at Posted at 2022-01-25

Jupyter自身のイベントループ上で新たにイベントループを開始しようとしたために起こったエラー。非同期処理を実行させたければ、await関数で直接実行させれば良い。

Jupyterで非同期処理を実行させる
import asyncio
import datetime

async def display_date():
    """現在時刻を5秒間表示する"""
    loop = asyncio.get_running_loop()
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if(loop.time()+1.0)>=end_time:
            break
        await asyncio.sleep(1)

x : asyncio.run(display_date())
 : await display_date()
2022-01-25 15:31:57.799997
2022-01-25 15:31:58.804521
2022-01-25 15:31:59.815091
2022-01-25 15:32:00.834119
2022-01-25 15:32:01.848780

じゃあjupyterのイベントループはどのファイルが実行してるの?

以下コードをnotebook上で実行すると、イベントループを実行していないにもかかわらず、現在イベントループが実行中という事がわかる。

import asyncio

asyncio.current_task()
notebook上で実行
<Task pending name='Task-2' coro=<Kernel.dispatch_queue()
 running at C:\Users\yourname\.pyenv\pyenv-win\versions\3.9.6\lib\site-packages\ipykernel\kernelbase.py:461>
 cb=[IOLoop.add_future.<locals>.<lambda>()
 at C:\Users\yourname\.pyenv\pyenv-win\versions\3.9.6\lib\site-packages\tornado\ioloop.py:688]>

notebookはtornadoというファイルによって実行されているということが分かる。

以下コードをターミナル上から実行するとasyncioによって実行されていることが分かる。

import asyncio


async def whats_event():
    print(asyncio.current_task())

asyncio.run(whats_event())
ターミナル上で実行
<Task pending name='Task-1' coro=<whats_event() 
running at c:\Users\yourname\lessons\python_lessons\project\aysnc_test.py:5> 
cb=[_run_until_complete_cb() 
at C:\Users\yourname\.pyenv\pyenv-win\versions\3.9.6\lib\asyncio\base_events.py:184]>
7
6
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
7
6