問題
jupyte-notebook
を動かしているサーバではフレームワークに tornado
を使っている。
tornado >= 5
のバージョンがインストールされた jupyter-notebook
上では、 asyncio
モジュールの event_loop
を扱うと RuntimeError
となる。
GitHub | jupyter/notebook | Can't invoke asyncio event_loop after tornado 5.0 update #3397
動かなかったサンプル
pyppeteer
を試そうとしたら遭遇した。。普通のREPL上では動くけどjupyter-notebook
上では動かない。
import asyncio
from pyppeteer import launch
loop = asyncio.get_event_loop()
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()
loop.run_until_complete(main())
結果
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-16-b0a5d64b1fb0> in <module>()
----> 1 loop.run_until_complete(main())
~/.anyenv/envs/pyenv/versions/3.6.4/lib/python3.6/asyncio/base_events.py in run_until_complete(self, future)
452 future.add_done_callback(_run_until_complete_cb)
453 try:
--> 454 self.run_forever()
455 except:
456 if new_task and future.done() and not future.cancelled():
~/.anyenv/envs/pyenv/versions/3.6.4/lib/python3.6/asyncio/base_events.py in run_forever(self)
406 self._check_closed()
407 if self.is_running():
--> 408 raise RuntimeError('This event loop is already running')
409 if events._get_running_loop() is not None:
410 raise RuntimeError(
RuntimeError: This event loop is already running
解決策
If I specify tornado==4.5.3 before pip install jupyter, it works fine
とのこと
$ pip install tornado<=4.5.3
$ pip install jupyter
jupyter
の requirements.txt
ではtornadoのバージョンは4以上であればよい、となっているので、更新はかからない。
原因
issue見る限り以下が原因だけど、よく分かっていないです。誰かご解説を。。
What’s new in Tornado 5.0 | backwards-compatibility-notes
"On Python 3, IOLoop is always a wrapper around the asyncio event loop."