Как запустить асинхронный код Python в блокноте Jupyter?Python

Программы на Python
Anonymous
Как запустить асинхронный код Python в блокноте Jupyter?

Сообщение Anonymous »

У меня есть асинхронный код, который отлично работает в интерпретаторе 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)
 in ()
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/sta ... onous.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
Это сработало, но я не совсем понимаю, почему и как это работает. Может кто-нибудь объяснить мне это?

Подробнее здесь: https://stackoverflow.com/questions/475 ... r-notebook

Вернуться в «Python»