ipythonzmq.txt
116 lines
| 6.2 KiB
| text/plain
|
TextLexer
Fernando Perez
|
r2590 | .. _ipythonzmq: | ||
Omar Andres Zapata Mesa
|
r2539 | |||
Fernando Perez
|
r2590 | ===================================================== | ||
Porting IPython to a two process model using zeromq | ||||
===================================================== | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
Fernando Perez
|
r2590 | Abstract | ||
-------- | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
Fernando Perez
|
r2590 | IPython's execution in a command-line environment will be ported to a two | ||
process model using the zeromq library for inter-process communication. this | ||||
will: | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
- prevent an interpreter crash from destroying the user session, | ||||
- allow multiple clients to interact simultaneously with a single interpreter | ||||
Fernando Perez
|
r2590 | - allow IPython to reuse code for local execution and distributed computing (dc) | ||
- give us a path for python3 support, since zeromq supports python3 while | ||||
twisted (what we use today for dc) does not. | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
Fernando Perez
|
r2590 | Project description | ||
Omar Andres Zapata Mesa
|
r2541 | ------------------- | ||
Omar Andres Zapata Mesa
|
r2539 | |||
Fernando Perez
|
r2590 | Currently IPython provides a command-line client that executes all code in a | ||
single process, and a set of tools for distributed and parallel computing that | ||||
execute code in multiple processes (possibly but not necessarily on different | ||||
hosts), using the twisted asynchronous framework for communication between | ||||
nodes. for a number of reasons, it is desirable to unify the architecture of | ||||
the local execution with that of distributed computing, since ultimately many | ||||
of the underlying abstractions are similar and should be reused. in | ||||
particular, we would like to: | ||||
- have even for a single user a 2-process model, so that the environment where | ||||
code is being input runs in a different process from that which executes the | ||||
code. this would prevent a crash of the python interpreter executing code | ||||
(because of a segmentation fault in a compiled extension or an improper | ||||
access to a c library via ctypes, for example) from destroying the user | ||||
session. | ||||
- have the same kernel used for executing code locally be available over the | ||||
network for distributed computing. currently the twisted-using IPython | ||||
engines for distributed computing do not share any code with the command-line | ||||
client, which means that many of the additional features of IPython (tab | ||||
completion, object introspection, magic functions, etc) are not available | ||||
while using the distributed computing system. once the regular command-line | ||||
environment is ported to allowing such a 2-process model, this newly | ||||
decoupled kernel could form the core of a distributed computing IPython | ||||
engine and all capabilities would be available throughout the system. | ||||
- have a route to python3 support. twisted is a large and complex library that | ||||
does currently not support python3, and as indicated by the twisted | ||||
developers it may take a while before it is ported | ||||
(http://stackoverflow.com/questions/172306/how-are-you-planning-on-handling-the-migration-to-python-3). | ||||
for IPython, this means that while we could port the command-line | ||||
environment, a large swath of IPython would be left 2.x-only, a highly | ||||
undesirable situation. for this reason, the search for an alternative to | ||||
twisted has been active for a while, and recently we've identified the zeromq | ||||
(http://www.zeromq.org, zmq for short) library as a viable candidate. zmq is | ||||
a fast, simple messaging library written in c++, for which one of the IPython | ||||
developers has written python bindings using cython | ||||
(http://www.zeromq.org/bindings:python). since cython already knows how to | ||||
generate python3-compliant bindings with a simple command-line switch, zmq | ||||
can be used with python3 when needed. | ||||
As part of the zmq python bindings, the IPython developers have already | ||||
developed a simple prototype of such a two-process kernel/frontend system | ||||
(details below). I propose to start from this example and port today's IPython | ||||
code to operate in a similar manner. IPython's command-line program (the main | ||||
'ipython' script) executes both user interaction and the user's code in the | ||||
same process. This project will thus require breaking up IPython into the parts | ||||
that correspond to the kernel and the parts that are meant to interact with the | ||||
user, and making these two components communicate over the network using zmq | ||||
instead of accessing local attributes and methods of a single global object. | ||||
Once this port is complete, the resulting tools will be the foundation (though | ||||
as part of this proposal i do not expect to undertake either of these tasks) to | ||||
allow the distributed computing parts of IPython to use the same code as the | ||||
command-line client, and for the whole system to be ported to python3. so | ||||
while i do not intend to tackle here the removal of twisted and the unification | ||||
of the local and distributed parts of IPython, my proposal is a necessary step | ||||
before those are possible. | ||||
Project details | ||||
--------------- | ||||
As part of the zeromq bindings, the IPython developers have already developed a | ||||
simple prototype example that provides a python execution kernel (with none of | ||||
IPython's code or features, just plain code execution) that listens on zmq | ||||
sockets, and a frontend based on the interactiveconsole class of the code.py | ||||
module from the python standard library. this example is capable of executing | ||||
code, propagating errors, performing tab-completion over the network and having | ||||
multiple frontends connect and disconnect simultaneously to a single kernel, | ||||
with all inputs and outputs being made available to all connected clients | ||||
(thanks to zqm's pub sockets that provide multicasting capabilities for the | ||||
kernel and to which the frontends subscribe via a sub socket). | ||||
We have all example code in: | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
* http://github.com/ellisonbg/pyzmq/blob/completer/examples/kernel/kernel.py | ||||
* http://github.com/ellisonbg/pyzmq/blob/completer/examples/kernel/completer.py | ||||
* http://github.com/fperez/pyzmq/blob/completer/examples/kernel/frontend.py | ||||
Fernando Perez
|
r2590 | all of this code already works, and can be seen in this example directory from | ||
the zmq python bindings: | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
* http://github.com/ellisonbg/pyzmq/blob/completer/examples/kernel | ||||
Fernando Perez
|
r2590 | Based on this work, i expect to write a stable system for IPython kernel with | ||
IPython standards, error control,crash recovery system and general | ||||
configuration options, also standardize defaults ports or auth system for | ||||
remote connection etc. | ||||
Omar Andres Zapata Mesa
|
r2539 | |||
Fernando Perez
|
r2590 | The crash recovery system, is a IPython kernel module for when it fails | ||
unexpectedly, you can retrieve the information from the section, this will be | ||||
based on a log and a lock file to indicate when the kernel was not closed in a | ||||
proper way. | ||||