Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

async cell execution #109

Open
kmike opened this issue Mar 2, 2016 · 3 comments
Open

async cell execution #109

kmike opened this issue Mar 2, 2016 · 3 comments

Comments

@kmike
Copy link

kmike commented Mar 2, 2016

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 ipython/ipython#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 #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?

@takluyver
Copy link
Member

aiokernel was an experiment that I didn't take any further. You might be interested in this extension:

https://gist.github.com/takluyver/b9663b08ac9a4472afa6

That allows you to write await code in cells (using a cell magic), and it will work as if you were inside a coroutine.

@kmike
Copy link
Author

kmike commented Mar 3, 2016

@takluyver nice example! Before going with hacks I tried to use crochet to get a function similar to run_until_complete for Twisted, but it didn't work (something about thread handling).

@flutefreak7
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants