ipython / ipython/ipykernel

async cell execution

Đang mở
#109 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Python
Star
734
Fork
412
Merge trung bình
1 ngày 5 giờ
Pull request đã merge (30 ngày)
8

Mô tả

Hi,

It'd be nice to be able to execute async code in IPython cells - this can allow using IPython to develop e.g. asyncio code (cell = implicit asyncio coroutine) or Scrapy spiders.

I'm having this problem in Splash Notebook kernel (https://github.com/scrapinghub/splash/blob/master/splash/kernel/kernel.py). This kernel runs a QWebKit browser in the same event loop as IPython and allows to control it using Lua scripts. Lua commands use coroutines; it means in Python land they use callbacks or deferreds. For example, there is `splash:go(url)` command which loads an URL in a browser and waits until all resources are loaded; this is implemented by loading URL and setting a callback for 'loadFinished' event.

Currently this is implemented using a hack: `Kernel.do_execute` returns a Deferred which is fired when load is finished, and `Kernel.execute_request` adds a callback to this Deferred to send the result back, instead of sending the result immediately.

This mostly works, but there are hacks required to make `idle` / `busy` handled correctly because ipykernel thinks results are always returned immediately. Kernel.dispatch_shell is handled incorrectly by these hacks, so sometimes kernel shows 'busy' state while it should be in 'idle' state; this breaks autocompletion for some reason (is it disabled when kernel is 'busy'?).

Sorry for a brain dump :) I don't really understand what I'm doing: what is `dispatch_shell` method for, what most arguments mean (parent? stream? ident? etc.). I've sent https://github.com/ipython/ipython/pull/7713 in past to make IPython internals easier to work with for such async code, but never addressed the feedback. I think async support is most important for execute messages because they have real use cases; async completion and other messages are less useful, so it is fine to handle only execute messages.

I've seen https://github.com/ipython/ipykernel/issues/21 and https://github.com/takluyver/aiokernel, but didn't understood it at all; aiokernel look very different from what I came up with, so I have no idea what is it doing, or if it is solving the same issue or not.

Thoughts? Am I on a right track? Is this feature welcome? Is there a clean(er) way to implement it?

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.