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]>