У меня есть код asyncio, который отлично работает в интерпретаторе Python (CPython 3.6.2). Теперь я хотел бы запустить это в ноутбуке Jupyter с ядром IPython.
Я могу запустить его с помощью
import asyncio
asyncio.get_event_loop().run_forever()
и в то время как это, кажется, работает, это также, кажется, блокирует ноутбук и, кажется, не играет хорошо с записной книжкой.
Я понимаю, что Jupyter использует Tornado под капотом, поэтому я попытался установить цикл событий Tornado, как рекомендовано в документах Tornado:
from tornado.platform.asyncio import AsyncIOMainLoop
AsyncIOMainLoop().install()
Однако это приводит к следующей ошибке:
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-1-1139449343fc> in <module>()
1 from tornado.platform.asyncio import AsyncIOMainLoop
----> 2 AsyncIOMainLoop().install()
~\AppData\Local\Continuum\Anaconda3\envs\numismatic\lib\site- packages\tornado\ioloop.py in install(self)
179 'IOLoop' (e.g., :class:'tornado.httpclient.AsyncHTTPClient').
180 """
--> 181 assert not IOLoop.initialized()
182 IOLoop._instance = self
183
AssertionError:
Наконец, я нашел следующую страницу: http://ipywidgets.readthedocs.io/en/stable/examples/Widget%20Asynchronous.html
поэтому я добавил ячейку со следующим кодом:
import asyncio
from ipykernel.eventloops import register_integration
@register_integration('asyncio')
def loop_asyncio(kernel):
'''Start a kernel with asyncio event loop support.'''
loop = asyncio.get_event_loop()
def kernel_handler():
loop.call_soon(kernel.do_one_iteration)
loop.call_later(kernel._poll_interval, kernel_handler)
loop.call_soon(kernel_handler)
try:
if not loop.is_running():
loop.run_forever()
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
и в следующей ячейке я побежал:
%gui asyncio
Это сработало, но я не понимаю, почему и как это работает. Может ли кто-нибудь объяснить это мне?