##// END OF EJS Templates
tabulation adjustment
tabulation adjustment

File last commit:

r9513:795686be
r10261:1e6394f8
Show More
kernelmanager.py
1130 lines | 39.5 KiB | text/x-python | PythonLexer
Brian Granger
Minor work on kernelmanager....
r2742 """Base classes to manage the interaction with a running kernel.
Brian Granger
Work on the kernel manager.
r2606
epatters
Implemented kernel interrupts for Windows.
r3027 TODO
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 * Create logger to handle debugging and console messages.
Brian Granger
Work on the kernel manager.
r2606 """
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 #-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
MinRK
mv IPython.zmq to IPython.kernel.zmq
r9372 from __future__ import absolute_import
MinRK
move zmq.KernelManagers into IPython.kernel
r9370 # Standard library imports
MinRK
attempt to suppress exceptions in daemon threads at shutdown...
r6319 import atexit
MinRK
ignore EINTR in channel loops...
r3928 import errno
MinRK
use stdlib json to load connection files in zmq.kernelmanager...
r5072 import json
epatters
* Implemented a proper main() function for kernel.py that reads command line input....
r2667 from subprocess import Popen
MinRK
use connection files instead of ports to connect to kernels...
r4958 import os
epatters
Implemented kernel interrupts for Windows.
r3027 import signal
epatters
Adding some temporary hacks to work around (Py)ZMQ bugs on Windows.
r2995 import sys
Brian Granger
Work on the kernel manager.
r2606 from threading import Thread
epatters
Added a flush method to the SubSocketChannel. The Qt console frontend now uses this method to ensure that output has been processed before it writes a new prompt.
r2614 import time
Brian Granger
Work on the kernel manager.
r2606
MinRK
move zmq.KernelManagers into IPython.kernel
r9370 # System library imports
Brian Granger
Work on the kernel manager.
r2606 import zmq
MinRK
avoid AttributeErrors on zmq.ZMQError at shutdown of qtconsole...
r5649 # import ZMQError in top-level namespace, to avoid ugly attribute-error messages
# during garbage collection of threads at exit:
from zmq import ZMQError
MinRK
use pyzmq tools where appropriate...
r5377 from zmq.eventloop import ioloop, zmqstream
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
MinRK
move zmq.KernelManagers into IPython.kernel
r9370 # Local imports
Brian E. Granger
Adding tested ipc support to MultiKernelManager.
r9116 from IPython.config.configurable import Configurable
MinRK
Possible fix for GH-169
r3144 from IPython.utils.localinterfaces import LOCALHOST, LOCAL_IPS
MinRK
use connection files instead of ports to connect to kernels...
r4958 from IPython.utils.traitlets import (
MinRK
allow custom kernel_cmd in KernelManager
r9348 Any, Instance, Type, Unicode, List, Integer, Bool, CaselessStrEnum
MinRK
use connection files instead of ports to connect to kernels...
r4958 )
MinRK
add KernelManager.load_connection_file method...
r4966 from IPython.utils.py3compat import str_to_bytes
MinRK
move utils.kernel (formerly entry_point and lib.kernel) to kernel.util
r9353 from IPython.kernel import (
MinRK
allow custom kernel_cmd in KernelManager
r9348 write_connection_file,
MinRK
s/make_kernel_cmd/make_ipkernel_cmd/
r9350 make_ipkernel_cmd,
MinRK
allow custom kernel_cmd in KernelManager
r9348 launch_kernel,
)
MinRK
define and test IPython.kernel public API
r9376 from .zmq.session import Session
from .kernelmanagerabc import (
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 ShellChannelABC, IOPubChannelABC,
HBChannelABC, StdInChannelABC,
KernelManagerABC
)
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 #-----------------------------------------------------------------------------
# Constants and exceptions
#-----------------------------------------------------------------------------
class InvalidPortNumber(Exception):
pass
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 #-----------------------------------------------------------------------------
Fernando Perez
Rework messaging to better conform to our spec....
r2926 # Utility functions
#-----------------------------------------------------------------------------
# some utilities to validate message structure, these might get moved elsewhere
# if they prove to have more generic utility
def validate_string_list(lst):
"""Validate that the input is a list of strings.
Raises ValueError if not."""
if not isinstance(lst, list):
raise ValueError('input %r must be a list' % lst)
for x in lst:
if not isinstance(x, basestring):
raise ValueError('element %r in list must be a string' % x)
def validate_string_dict(dct):
"""Validate that the input is a dict with string keys and values.
Raises ValueError if not."""
for k,v in dct.iteritems():
if not isinstance(k, basestring):
raise ValueError('key %r in dict must be a string' % k)
if not isinstance(v, basestring):
raise ValueError('value %r in dict must be a string' % v)
#-----------------------------------------------------------------------------
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 # ZMQ Socket Channel classes
#-----------------------------------------------------------------------------
Brian Granger
Work on the kernel manager.
r2606
MinRK
cleanup channel names to match function not socket...
r3974 class ZMQSocketChannel(Thread):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """The base class for the channels that use ZMQ sockets."""
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 context = None
session = None
socket = None
ioloop = None
MinRK
use pyzmq tools where appropriate...
r5377 stream = None
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 _address = None
MinRK
attempt to suppress exceptions in daemon threads at shutdown...
r6319 _exiting = False
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
def __init__(self, context, session, address):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Create a channel.
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
Brian Granger
Minor work on kernelmanager....
r2742 context : :class:`zmq.Context`
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 The ZMQ context to use.
Brian Granger
Minor work on kernelmanager....
r2742 session : :class:`session.Session`
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 The session to use.
MinRK
enable IPC transport for kernels...
r7321 address : zmq url
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Standard (ip, port) tuple that the kernel is listening on.
"""
MinRK
cleanup channel names to match function not socket...
r3974 super(ZMQSocketChannel, self).__init__()
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 self.daemon = True
Brian Granger
Work on the kernel manager.
r2606 self.context = context
self.session = session
MinRK
enable IPC transport for kernels...
r7321 if isinstance(address, tuple):
if address[1] == 0:
message = 'The port number for a channel cannot be 0.'
raise InvalidPortNumber(message)
address = "tcp://%s:%i" % address
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self._address = address
MinRK
attempt to suppress exceptions in daemon threads at shutdown...
r6319 atexit.register(self._notice_exit)
def _notice_exit(self):
self._exiting = True
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631
MinRK
ignore EINTR in channel loops...
r3928 def _run_loop(self):
"""Run my loop, ignoring EINTR events in the poller"""
while True:
try:
self.ioloop.start()
MinRK
avoid AttributeErrors on zmq.ZMQError at shutdown of qtconsole...
r5649 except ZMQError as e:
MinRK
ignore EINTR in channel loops...
r3928 if e.errno == errno.EINTR:
continue
else:
raise
MinRK
attempt to suppress exceptions in daemon threads at shutdown...
r6319 except Exception:
if self._exiting:
break
else:
raise
MinRK
ignore EINTR in channel loops...
r3928 else:
break
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 def stop(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Stop the channel's event loop and join its thread.
Brian Granger
Channels can no longer be restarted.
r2691
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 This calls :method:`Thread.join` and returns when the thread
Bernardo B. Marques
remove all trailling spaces
r4872 terminates. :class:`RuntimeError` will be raised if
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 :method:`self.start` is called again.
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 """
epatters
Fixed kernelmanager threads not being restartable.
r2642 self.join()
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 @property
def address(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get the channel's address as a zmq url string.
These URLS have the form: 'tcp://127.0.0.1:5555'.
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 """
return self._address
MinRK
use pyzmq tools where appropriate...
r5377 def _queue_send(self, msg):
"""Queue a message to be sent from the IOLoop's thread.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
MinRK
use pyzmq tools where appropriate...
r5377 msg : message to send
This is threadsafe, as it uses IOLoop.add_callback to give the loop's
thread control of the action.
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 """
MinRK
use pyzmq tools where appropriate...
r5377 def thread_send():
self.session.send(self.stream, msg)
self.ioloop.add_callback(thread_send)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
MinRK
use pyzmq tools where appropriate...
r5377 def _handle_recv(self, msg):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Callback for stream.on_recv.
Unpacks message, and calls handlers with it.
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 """
MinRK
use pyzmq tools where appropriate...
r5377 ident,smsg = self.session.feed_identities(msg)
self.call_handlers(self.session.unserialize(smsg))
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Cleanup naming and organization of channels....
r9120 class ShellChannel(ZMQSocketChannel):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """The shell channel for issuing request/replies to the kernel."""
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 command_queue = None
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 # flag for whether execute requests should be allowed to call raw_input:
allow_stdin = True
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
def __init__(self, context, session, address):
Brian Granger
Cleanup naming and organization of channels....
r9120 super(ShellChannel, self).__init__(context, session, address)
epatters
Thread safety fix in KernelManager:...
r2996 self.ioloop = ioloop.IOLoop()
Brian Granger
Work on the kernel manager.
r2606
def run(self):
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """The thread's main activity. Call start() instead."""
MinRK
use ROUTER/DEALER socket names instead of XREP/XREQ...
r4725 self.socket = self.context.socket(zmq.DEALER)
MinRK
add Session.bsession trait for session id as bytes
r4770 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
MinRK
enable IPC transport for kernels...
r7321 self.socket.connect(self.address)
MinRK
use pyzmq tools where appropriate...
r5377 self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
self.stream.on_recv(self._handle_recv)
MinRK
ignore EINTR in channel loops...
r3928 self._run_loop()
MinRK
close KernelManager channel sockets when they stop...
r6564 try:
self.socket.close()
except:
pass
Brian Granger
Work on the kernel manager.
r2606
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 def stop(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Stop the channel's event loop and join its thread."""
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 self.ioloop.stop()
Brian Granger
Cleanup naming and organization of channels....
r9120 super(ShellChannel, self).stop()
Brian Granger
Work on the kernel manager.
r2606
def call_handlers(self, msg):
Brian Granger
General cleanup of kernelmanager.py....
r2692 """This method is called in the ioloop thread when a message arrives.
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
General cleanup of kernelmanager.py....
r2692 Subclasses should override this method to handle incoming messages.
It is important to remember that this method is called in the thread
so that some logic must be done to ensure that the application leve
handlers are called in the application thread.
"""
raise NotImplementedError('call_handlers must be defined in a subclass.')
Brian Granger
Work on the kernel manager.
r2606
Jason Grout
Push store_history parameter up to kernelmanager.
r8000 def execute(self, code, silent=False, store_history=True,
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 user_variables=None, user_expressions=None, allow_stdin=None):
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """Execute code in the kernel.
epatters
Made KernelManager's flush() method more robust and added a timeout parameter for safety.
r2672
Parameters
----------
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 code : str
A string of Python code.
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
* Added support for prompt and history requests to the kernel manager and Qt console frontend....
r2844 silent : bool, optional (default False)
Jason Grout
Push store_history parameter up to kernelmanager.
r8000 If set, the kernel will execute the code as quietly possible, and
will force store_history to be False.
store_history : bool, optional (default True)
Jason Grout
fix typo in docs
r8001 If set, the kernel will store command history. This is forced
Jason Grout
Push store_history parameter up to kernelmanager.
r8000 to be False if silent is True.
epatters
Added a flush method to the SubSocketChannel. The Qt console frontend now uses this method to ensure that output has been processed before it writes a new prompt.
r2614
Fernando Perez
Rework messaging to better conform to our spec....
r2926 user_variables : list, optional
A list of variable names to pull from the user's namespace. They
will come back as a dict with these names as keys and their
:func:`repr` as values.
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Rework messaging to better conform to our spec....
r2926 user_expressions : dict, optional
epatters
DOC: Fix incorrect docstring for KernelManager.execute().
r8349 A dict mapping names to expressions to be evaluated in the user's
dict. The expression values are returned as strings formatted using
:func:`repr`.
allow_stdin : bool, optional (default self.allow_stdin)
Flag for whether the kernel can send stdin requests to frontends.
Some frontends (e.g. the Notebook) do not support stdin requests.
If raw_input is called from code executed from such a frontend, a
StdinNotImplementedError will be raised.
MinRK
use ROUTER/DEALER sockets for stdin...
r4952
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Returns
-------
The msg_id of the message sent.
"""
Fernando Perez
Rework messaging to better conform to our spec....
r2926 if user_variables is None:
user_variables = []
if user_expressions is None:
user_expressions = {}
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 if allow_stdin is None:
allow_stdin = self.allow_stdin
Fernando Perez
Rework messaging to better conform to our spec....
r2926 # Don't waste network traffic if inputs are invalid
if not isinstance(code, basestring):
raise ValueError('code %r must be a string' % code)
validate_string_list(user_variables)
validate_string_dict(user_expressions)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 # Create class for content/msg creation. Related to, but possibly
# not in Session.
Jason Grout
Push store_history parameter up to kernelmanager.
r8000 content = dict(code=code, silent=silent, store_history=store_history,
Fernando Perez
Rework messaging to better conform to our spec....
r2926 user_variables=user_variables,
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 user_expressions=user_expressions,
allow_stdin=allow_stdin,
)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 msg = self.session.msg('execute_request', content)
MinRK
use pyzmq tools where appropriate...
r5377 self._queue_send(msg)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 return msg['header']['msg_id']
Brian Granger
Work on the kernel manager.
r2606
Fernando Perez
Multiple improvements to tab completion....
r2839 def complete(self, text, line, cursor_pos, block=None):
epatters
* Tab completion now uses the correct cursor position....
r2841 """Tab complete text in the kernel's namespace.
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
text : str
The text to complete.
line : str
Bernardo B. Marques
remove all trailling spaces
r4872 The full line of text that is the surrounding context for the
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 text to complete.
epatters
* Tab completion now uses the correct cursor position....
r2841 cursor_pos : int
The position of the cursor in the line where the completion was
requested.
block : str, optional
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 The full block of code in which the completion is being requested.
Returns
-------
The msg_id of the message sent.
"""
Fernando Perez
Multiple improvements to tab completion....
r2839 content = dict(text=text, line=line, block=block, cursor_pos=cursor_pos)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 msg = self.session.msg('complete_request', content)
MinRK
use pyzmq tools where appropriate...
r5377 self._queue_send(msg)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 return msg['header']['msg_id']
Brian Granger
Work on the kernel manager.
r2606
MinRK
add detail_level to object_info requests...
r6556 def object_info(self, oname, detail_level=0):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get metadata information about an object in the kernel's namespace.
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
oname : str
A string specifying the object name.
MinRK
add detail_level to object_info requests...
r6556 detail_level : int, optional
The level of detail for the introspection (0-2)
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Returns
-------
The msg_id of the message sent.
"""
MinRK
add detail_level to object_info requests...
r6556 content = dict(oname=oname, detail_level=detail_level)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 msg = self.session.msg('object_info_request', content)
MinRK
use pyzmq tools where appropriate...
r5377 self._queue_send(msg)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 return msg['header']['msg_id']
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632
Thomas Kluyver
Put the whole history interface into kernelmanager.
r3819 def history(self, raw=True, output=False, hist_access_type='range', **kwargs):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get entries from the kernel's history list.
epatters
* Added support for prompt and history requests to the kernel manager and Qt console frontend....
r2844
Parameters
----------
raw : bool
If True, return the raw input.
output : bool
If True, then return the output as well.
Thomas Kluyver
Put the whole history interface into kernelmanager.
r3819 hist_access_type : str
'range' (fill in session, start and stop params), 'tail' (fill in n)
or 'search' (fill in pattern param).
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Put the whole history interface into kernelmanager.
r3819 session : int
For a range request, the session from which to get lines. Session
numbers are positive integers; negative ones count back from the
current session.
start : int
The first line number of a history range.
stop : int
The final (excluded) line number of a history range.
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Put the whole history interface into kernelmanager.
r3819 n : int
The number of lines of history to get for a tail request.
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Put the whole history interface into kernelmanager.
r3819 pattern : str
The glob-syntax pattern for a search request.
epatters
* Added support for prompt and history requests to the kernel manager and Qt console frontend....
r2844
Returns
-------
The msg_id of the message sent.
"""
Thomas Kluyver
Put the whole history interface into kernelmanager.
r3819 content = dict(raw=raw, output=output, hist_access_type=hist_access_type,
**kwargs)
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 msg = self.session.msg('history_request', content)
MinRK
use pyzmq tools where appropriate...
r5377 self._queue_send(msg)
epatters
* Added support for prompt and history requests to the kernel manager and Qt console frontend....
r2844 return msg['header']['msg_id']
Takafumi Arakaki
Rename remnant of version_request/reply protocol
r8905 def kernel_info(self):
"""Request kernel info."""
Takafumi Arakaki
Rename version_rep/req to kernel_info_rep/req
r8879 msg = self.session.msg('kernel_info_request')
Takafumi Arakaki
Add a test for version_request in test_message_spec.py
r8831 self._queue_send(msg)
return msg['header']['msg_id']
MinRK
added reset:<bool> to shutdown_request content; shutdown_message broadcast on PUB for multiclient notification
r3089 def shutdown(self, restart=False):
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 """Request an immediate kernel shutdown.
Upon receipt of the (empty) reply, client code can safely assume that
the kernel has shut down and it's safe to forcefully terminate it if
it's still alive.
The kernel will send the reply via a function registered with Python's
atexit module, ensuring it's truly done as the kernel is done with all
normal operation.
"""
# Send quit message to kernel. Once we implement kernel-side setattr,
# this should probably be done that way, but for now this will do.
MinRK
added reset:<bool> to shutdown_request content; shutdown_message broadcast on PUB for multiclient notification
r3089 msg = self.session.msg('shutdown_request', {'restart':restart})
MinRK
use pyzmq tools where appropriate...
r5377 self._queue_send(msg)
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 return msg['header']['msg_id']
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
Brian Granger
Cleanup naming and organization of channels....
r9120 class IOPubChannel(ZMQSocketChannel):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """The iopub channel which listens for messages that the kernel publishes.
This channel is where all output is published to frontends.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """
def __init__(self, context, session, address):
Brian Granger
Cleanup naming and organization of channels....
r9120 super(IOPubChannel, self).__init__(context, session, address)
epatters
Thread safety fix in KernelManager:...
r2996 self.ioloop = ioloop.IOLoop()
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
def run(self):
"""The thread's main activity. Call start() instead."""
self.socket = self.context.socket(zmq.SUB)
Thomas Kluyver
More Python 3 compatibility fixes.
r4735 self.socket.setsockopt(zmq.SUBSCRIBE,b'')
MinRK
add Session.bsession trait for session id as bytes
r4770 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
MinRK
enable IPC transport for kernels...
r7321 self.socket.connect(self.address)
MinRK
use pyzmq tools where appropriate...
r5377 self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
self.stream.on_recv(self._handle_recv)
MinRK
ignore EINTR in channel loops...
r3928 self._run_loop()
MinRK
close KernelManager channel sockets when they stop...
r6564 try:
self.socket.close()
except:
pass
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
def stop(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Stop the channel's event loop and join its thread."""
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.ioloop.stop()
Brian Granger
Cleanup naming and organization of channels....
r9120 super(IOPubChannel, self).stop()
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
Brian Granger
Cleanup of the XREQ channel....
r2697 def call_handlers(self, msg):
"""This method is called in the ioloop thread when a message arrives.
Subclasses should override this method to handle incoming messages.
It is important to remember that this method is called in the thread
so that some logic must be done to ensure that the application leve
handlers are called in the application thread.
"""
raise NotImplementedError('call_handlers must be defined in a subclass.')
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 def flush(self, timeout=1.0):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Immediately processes all pending messages on the iopub channel.
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Minor work on kernelmanager....
r2742 Callers should use this method to ensure that :method:`call_handlers`
has been called for all messages that have been received on the
0MQ SUB socket of this channel.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 This method is thread safe.
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
timeout : float, optional
The maximum amount of time to spend flushing, in seconds. The
default is one second.
"""
# We do the IOLoop callback process twice to ensure that the IOLoop
# gets to perform at least one full poll.
stop_time = time.time() + timeout
for i in xrange(2):
self._flushed = False
self.ioloop.add_callback(self._flush)
while not self._flushed and time.time() < stop_time:
time.sleep(0.01)
def _flush(self):
"""Callback for :method:`self.flush`."""
MinRK
use pyzmq tools where appropriate...
r5377 self.stream.flush()
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self._flushed = True
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Cleanup naming and organization of channels....
r9120 class StdInChannel(ZMQSocketChannel):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """The stdin channel to handle raw_input requests that the kernel makes."""
Brian Granger
Work on the kernel manager.
r2606
epatters
Basic raw_input implementation is now working.
r2707 msg_queue = None
def __init__(self, context, session, address):
Brian Granger
Cleanup naming and organization of channels....
r9120 super(StdInChannel, self).__init__(context, session, address)
epatters
Thread safety fix in KernelManager:...
r2996 self.ioloop = ioloop.IOLoop()
epatters
Basic raw_input implementation is now working.
r2707
epatters
Merge branch 'kernelmanager' of git://github.com/ellisonbg/ipython into qtfrontend. Fixed breakage and conflicts from merge....
r2701 def run(self):
"""The thread's main activity. Call start() instead."""
MinRK
use ROUTER/DEALER socket names instead of XREP/XREQ...
r4725 self.socket = self.context.socket(zmq.DEALER)
MinRK
add Session.bsession trait for session id as bytes
r4770 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
MinRK
enable IPC transport for kernels...
r7321 self.socket.connect(self.address)
MinRK
use pyzmq tools where appropriate...
r5377 self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
self.stream.on_recv(self._handle_recv)
MinRK
ignore EINTR in channel loops...
r3928 self._run_loop()
MinRK
close KernelManager channel sockets when they stop...
r6564 try:
self.socket.close()
except:
pass
epatters
Merge branch 'kernelmanager' of git://github.com/ellisonbg/ipython into qtfrontend. Fixed breakage and conflicts from merge....
r2701
def stop(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Stop the channel's event loop and join its thread."""
epatters
Merge branch 'kernelmanager' of git://github.com/ellisonbg/ipython into qtfrontend. Fixed breakage and conflicts from merge....
r2701 self.ioloop.stop()
Brian Granger
Cleanup naming and organization of channels....
r9120 super(StdInChannel, self).stop()
Brian Granger
Work on the kernel manager.
r2606
epatters
Basic raw_input implementation is now working.
r2707 def call_handlers(self, msg):
"""This method is called in the ioloop thread when a message arrives.
Subclasses should override this method to handle incoming messages.
It is important to remember that this method is called in the thread
so that some logic must be done to ensure that the application leve
handlers are called in the application thread.
"""
raise NotImplementedError('call_handlers must be defined in a subclass.')
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 def input(self, string):
"""Send a string of raw input to the kernel."""
content = dict(value=string)
msg = self.session.msg('input_reply', content)
MinRK
use pyzmq tools where appropriate...
r5377 self._queue_send(msg)
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
Brian Granger
Cleanup naming and organization of channels....
r9120 class HBChannel(ZMQSocketChannel):
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 """The heartbeat channel which monitors the kernel heartbeat.
Note that the heartbeat channel is paused by default. As long as you start
this channel, the kernel manager will ensure that it is paused and un-paused
as appropriate.
"""
Brian Granger
Added heartbeat support.
r2910
Brian Granger
Fixing logic in heartbeat monitor.
r2925 time_to_dead = 3.0
Brian Granger
Added heartbeat support.
r2910 socket = None
poller = None
Brian Granger
Added pausing to the heartbeat channel.
r3023 _running = None
_pause = None
MinRK
Fixes to the heartbeat channel...
r5614 _beating = None
Brian Granger
Added heartbeat support.
r2910
def __init__(self, context, session, address):
Brian Granger
Cleanup naming and organization of channels....
r9120 super(HBChannel, self).__init__(context, session, address)
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 self._running = False
MinRK
Fixes to the heartbeat channel...
r5614 self._pause =True
self.poller = zmq.Poller()
Brian Granger
Added heartbeat support.
r2910
def _create_socket(self):
MinRK
Fixes to the heartbeat channel...
r5614 if self.socket is not None:
# close previous socket, before opening a new one
self.poller.unregister(self.socket)
self.socket.close()
Brian Granger
Added heartbeat support.
r2910 self.socket = self.context.socket(zmq.REQ)
MinRK
Fixes to the heartbeat channel...
r5614 self.socket.setsockopt(zmq.LINGER, 0)
MinRK
enable IPC transport for kernels...
r7321 self.socket.connect(self.address)
MinRK
Fixes to the heartbeat channel...
r5614
Brian Granger
Added heartbeat support.
r2910 self.poller.register(self.socket, zmq.POLLIN)
MinRK
Fixes to the heartbeat channel...
r5614
def _poll(self, start_time):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """poll for heartbeat replies until we reach self.time_to_dead.
MinRK
Fixes to the heartbeat channel...
r5614
Ignores interrupts, and returns the result of poll(), which
will be an empty list if no messages arrived before the timeout,
or the event tuple if there is a message to receive.
"""
until_dead = self.time_to_dead - (time.time() - start_time)
# ensure poll at least once
until_dead = max(until_dead, 1e-3)
events = []
while True:
try:
events = self.poller.poll(1000 * until_dead)
MinRK
avoid AttributeErrors on zmq.ZMQError at shutdown of qtconsole...
r5649 except ZMQError as e:
MinRK
Fixes to the heartbeat channel...
r5614 if e.errno == errno.EINTR:
# ignore interrupts during heartbeat
# this may never actually happen
until_dead = self.time_to_dead - (time.time() - start_time)
until_dead = max(until_dead, 1e-3)
pass
else:
raise
MinRK
attempt to suppress exceptions in daemon threads at shutdown...
r6319 except Exception:
if self._exiting:
break
else:
raise
MinRK
Fixes to the heartbeat channel...
r5614 else:
break
return events
Brian Granger
Added heartbeat support.
r2910
def run(self):
"""The thread's main activity. Call start() instead."""
self._create_socket()
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 self._running = True
MinRK
Fixes to the heartbeat channel...
r5614 self._beating = True
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 while self._running:
Brian Granger
Added pausing to the heartbeat channel.
r3023 if self._pause:
MinRK
Fixes to the heartbeat channel...
r5614 # just sleep, and skip the rest of the loop
Brian Granger
Added pausing to the heartbeat channel.
r3023 time.sleep(self.time_to_dead)
MinRK
Fixes to the heartbeat channel...
r5614 continue
since_last_heartbeat = 0.0
# io.rprint('Ping from HB channel') # dbg
# no need to catch EFSM here, because the previous event was
# either a recv or connect, which cannot be followed by EFSM
self.socket.send(b'ping')
request_time = time.time()
ready = self._poll(request_time)
if ready:
self._beating = True
# the poll above guarantees we have something to recv
self.socket.recv()
# sleep the remainder of the cycle
remainder = self.time_to_dead - (time.time() - request_time)
if remainder > 0:
time.sleep(remainder)
continue
Brian Granger
Added heartbeat support.
r2910 else:
MinRK
Fixes to the heartbeat channel...
r5614 # nothing was received within the time limit, signal heart failure
self._beating = False
since_last_heartbeat = time.time() - request_time
self.call_handlers(since_last_heartbeat)
# and close/reopen the socket, because the REQ/REP cycle has been broken
self._create_socket()
continue
MinRK
close KernelManager channel sockets when they stop...
r6564 try:
self.socket.close()
except:
pass
Brian Granger
Added pausing to the heartbeat channel.
r3023
def pause(self):
"""Pause the heartbeat."""
self._pause = True
def unpause(self):
"""Unpause the heartbeat."""
self._pause = False
def is_beating(self):
MinRK
Fixes to the heartbeat channel...
r5614 """Is the heartbeat running and responsive (and not paused)."""
if self.is_alive() and not self._pause and self._beating:
Brian Granger
Added pausing to the heartbeat channel.
r3023 return True
else:
return False
Brian Granger
Added heartbeat support.
r2910
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 def stop(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Stop the channel's event loop and join its thread."""
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 self._running = False
Brian Granger
Cleanup naming and organization of channels....
r9120 super(HBChannel, self).stop()
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915
Brian Granger
Added heartbeat support.
r2910 def call_handlers(self, since_last_heartbeat):
"""This method is called in the ioloop thread when a message arrives.
Subclasses should override this method to handle incoming messages.
It is important to remember that this method is called in the thread
MinRK
Fixes to the heartbeat channel...
r5614 so that some logic must be done to ensure that the application level
Brian Granger
Added heartbeat support.
r2910 handlers are called in the application thread.
"""
raise NotImplementedError('call_handlers must be defined in a subclass.')
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 #-----------------------------------------------------------------------------
# Main kernel manager class
#-----------------------------------------------------------------------------
Brian E. Granger
Adding tested ipc support to MultiKernelManager.
r9116 class KernelManager(Configurable):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Manages a single kernel on this host along with its channels.
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 There are four channels associated with each kernel:
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 * shell: for request/reply calls to the kernel.
* iopub: for the kernel to publish results to frontends.
* hb: for monitoring the kernel's heartbeat.
* stdin: for frontends to reply to raw_input calls in the kernel.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 The usage of the channels that this class manages is optional. It is
entirely possible to connect to the kernels directly using ZeroMQ
sockets. These channels are useful primarily for talking to a kernel
whose :class:`KernelManager` is in the same process.
This version manages kernels started using Popen.
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631 """
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 # The PyZMQ Context to use for communication with the kernel.
MinRK
finish plumbing config to Session objects...
r4015 context = Instance(zmq.Context)
def _context_default(self):
return zmq.Context.instance()
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
# The Session to use for communication with the kernel.
MinRK
finish plumbing config to Session objects...
r4015 session = Instance(Session)
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 def _session_default(self):
return Session(config=self.config)
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 # The kernel process with which the KernelManager is communicating.
MinRK
allow custom kernel_cmd in KernelManager
r9348 # generally a Popen instance
kernel = Any()
kernel_cmd = List(Unicode, config=True,
help="""The Popen Command to launch the kernel.
Override this if you have a custom
"""
)
def _kernel_cmd_changed(self, name, old, new):
self.ipython_kernel = False
ipython_kernel = Bool(True)
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730
Bernardo B. Marques
remove all trailling spaces
r4872 # The addresses for the communication channels.
MinRK
use connection files instead of ports to connect to kernels...
r4958 connection_file = Unicode('')
MinRK
enable IPC transport for kernels...
r7321
Brian E. Granger
Adding tested ipc support to MultiKernelManager.
r9116 transport = CaselessStrEnum(['tcp', 'ipc'], default_value='tcp', config=True)
MinRK
improve default ipc file locations...
r9175 ip = Unicode(LOCALHOST, config=True,
help="""Set the kernel\'s IP address [default localhost].
If the IP address is something other than localhost, then
Consoles on other machines will be able to connect
to the Kernel, so be careful!"""
)
def _ip_default(self):
if self.transport == 'ipc':
if self.connection_file:
return os.path.splitext(self.connection_file)[0] + '-ipc'
else:
return 'kernel-ipc'
else:
return LOCALHOST
MinRK
fix --ip='*' argument in various apps...
r5170 def _ip_changed(self, name, old, new):
if new == '*':
self.ip = '0.0.0.0'
MinRK
add Integer traitlet...
r5344 shell_port = Integer(0)
iopub_port = Integer(0)
stdin_port = Integer(0)
hb_port = Integer(0)
epatters
* The SVG payload matplotlib backend now works....
r2758
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 # The classes to use for the various channels.
Brian Granger
Cleanup naming and organization of channels....
r9120 shell_channel_class = Type(ShellChannel)
iopub_channel_class = Type(IOPubChannel)
stdin_channel_class = Type(StdInChannel)
hb_channel_class = Type(HBChannel)
Brian Granger
Draft of context closing....
r3046
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 # Protected traits.
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 _launch_args = Any
MinRK
cleanup channel names to match function not socket...
r3974 _shell_channel = Any
Brian Granger
Cleanup naming and organization of channels....
r9120 _iopub_channel = Any
MinRK
cleanup channel names to match function not socket...
r3974 _stdin_channel = Any
Brian Granger
Added heartbeat support.
r2910 _hb_channel = Any
MinRK
use connection files instead of ports to connect to kernels...
r4958 _connection_file_written=Bool(False)
MinRK
improve default ipc file locations...
r9175
def __del__(self):
Brian E. Granger
Putting connection file cleanup back in __del__.
r9154 self.cleanup_connection_file()
Brian E. Granger
Removing connection/ipc file cleanup from KernelManager.__del__.
r9152
epatters
* The SVG payload matplotlib backend now works....
r2758 #--------------------------------------------------------------------------
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 # Channel management methods:
#--------------------------------------------------------------------------
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 def start_channels(self, shell=True, iopub=True, stdin=True, hb=True):
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 """Starts the channels for this kernel.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
This will create the channels if they do not exist and then start
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 them (their activity runs in a thread). If port numbers of 0 are
being used (random ports) then you must first call
:method:`start_kernel`. If the channels have been stopped and you
call this, :class:`RuntimeError` will be raised.
epatters
Added 'start_listening' and 'stop_listening' methods to the kernel manager.
r2639 """
MinRK
cleanup channel names to match function not socket...
r3974 if shell:
self.shell_channel.start()
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 if iopub:
Brian Granger
Cleanup naming and organization of channels....
r9120 self.iopub_channel.start()
MinRK
cleanup channel names to match function not socket...
r3974 if stdin:
self.stdin_channel.start()
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 self.shell_channel.allow_stdin = True
else:
self.shell_channel.allow_stdin = False
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 if hb:
self.hb_channel.start()
epatters
Added 'start_listening' and 'stop_listening' methods to the kernel manager.
r2639
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 def stop_channels(self):
epatters
* Added support to KernelManager for starting a subset of the four channels....
r2994 """Stops all the running channels for this kernel.
Brian E. Granger
More kernelmanager docstring cleanup.
r9129
This stops their event loops and joins their threads.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """
MinRK
cleanup channel names to match function not socket...
r3974 if self.shell_channel.is_alive():
self.shell_channel.stop()
Brian Granger
Cleanup naming and organization of channels....
r9120 if self.iopub_channel.is_alive():
self.iopub_channel.stop()
MinRK
cleanup channel names to match function not socket...
r3974 if self.stdin_channel.is_alive():
self.stdin_channel.stop()
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 if self.hb_channel.is_alive():
self.hb_channel.stop()
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 @property
def channels_running(self):
epatters
* Added support to KernelManager for starting a subset of the four channels....
r2994 """Are any of the channels created and running?"""
Brian Granger
Cleanup naming and organization of channels....
r9120 return (self.shell_channel.is_alive() or self.iopub_channel.is_alive() or
MinRK
cleanup channel names to match function not socket...
r3974 self.stdin_channel.is_alive() or self.hb_channel.is_alive())
epatters
Added 'start_listening' and 'stop_listening' methods to the kernel manager.
r2639
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 def _make_url(self, port):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Make a zmq url with a port.
There are two cases that this handles:
* tcp: tcp://ip:port
* ipc: ipc://ip-port
"""
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 if self.transport == 'tcp':
return "tcp://%s:%i" % (self.ip, port)
else:
return "%s://%s-%s" % (self.transport, self.ip, port)
@property
def shell_channel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get the shell channel object for this kernel."""
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 if self._shell_channel is None:
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 self._shell_channel = self.shell_channel_class(
self.context, self.session, self._make_url(self.shell_port)
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 )
return self._shell_channel
@property
def iopub_channel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get the iopub channel object for this kernel."""
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 if self._iopub_channel is None:
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 self._iopub_channel = self.iopub_channel_class(
self.context, self.session, self._make_url(self.iopub_port)
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 )
return self._iopub_channel
@property
def stdin_channel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get the stdin channel object for this kernel."""
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 if self._stdin_channel is None:
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 self._stdin_channel = self.stdin_channel_class(
self.context, self.session, self._make_url(self.stdin_port)
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 )
return self._stdin_channel
@property
def hb_channel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Get the hb channel object for this kernel."""
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 if self._hb_channel is None:
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 self._hb_channel = self.hb_channel_class(
self.context, self.session, self._make_url(self.hb_port)
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 )
return self._hb_channel
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 #--------------------------------------------------------------------------
Brian E. Granger
Final cleanup of kernelmanager...
r9151 # Connection and ipc file management
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 #--------------------------------------------------------------------------
MinRK
use connection files instead of ports to connect to kernels...
r4958
MinRK
improve cleanup of connection files...
r5609 def cleanup_connection_file(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Cleanup connection file *if we wrote it*
MinRK
improve cleanup of connection files...
r5609
Will not raise if the connection file was already removed somehow.
"""
if self._connection_file_written:
# cleanup connection files on full shutdown of kernel we started
self._connection_file_written = False
try:
os.remove(self.connection_file)
MinRK
catch AttributeError in cleanup_connection_files...
r9513 except (IOError, OSError, AttributeError):
MinRK
enable IPC transport for kernels...
r7321 pass
Brian Granger
Fixing bug in cleanup of ipc files and adding new to shutdown....
r9119 def cleanup_ipc_files(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Cleanup ipc files if we wrote them."""
MinRK
enable IPC transport for kernels...
r7321 if self.transport != 'ipc':
return
for port in (self.shell_port, self.iopub_port, self.stdin_port, self.hb_port):
ipcfile = "%s-%i" % (self.ip, port)
try:
os.remove(ipcfile)
except (IOError, OSError):
MinRK
improve cleanup of connection files...
r5609 pass
Brian E. Granger
Adding tested ipc support to MultiKernelManager.
r9116
MinRK
add KernelManager.load_connection_file method...
r4966 def load_connection_file(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Load connection info from JSON dict in self.connection_file."""
MinRK
add KernelManager.load_connection_file method...
r4966 with open(self.connection_file) as f:
cfg = json.loads(f.read())
Brian E. Granger
Adding tested ipc support to MultiKernelManager.
r9116
MinRK
enable IPC transport for kernels...
r7321 from pprint import pprint
pprint(cfg)
self.transport = cfg.get('transport', 'tcp')
MinRK
add KernelManager.load_connection_file method...
r4966 self.ip = cfg['ip']
self.shell_port = cfg['shell_port']
self.stdin_port = cfg['stdin_port']
self.iopub_port = cfg['iopub_port']
self.hb_port = cfg['hb_port']
self.session.key = str_to_bytes(cfg['key'])
MinRK
use connection files instead of ports to connect to kernels...
r4958 def write_connection_file(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Write connection info to JSON dict in self.connection_file."""
MinRK
use connection files instead of ports to connect to kernels...
r4958 if self._connection_file_written:
return
self.connection_file,cfg = write_connection_file(self.connection_file,
MinRK
enable IPC transport for kernels...
r7321 transport=self.transport, ip=self.ip, key=self.session.key,
MinRK
fix remaining sub_port -> iopub_port in kernelmanager
r4959 stdin_port=self.stdin_port, iopub_port=self.iopub_port,
MinRK
use connection files instead of ports to connect to kernels...
r4958 shell_port=self.shell_port, hb_port=self.hb_port)
# write_connection_file also sets default ports:
self.shell_port = cfg['shell_port']
self.stdin_port = cfg['stdin_port']
MinRK
fix remaining sub_port -> iopub_port in kernelmanager
r4959 self.iopub_port = cfg['iopub_port']
MinRK
use connection files instead of ports to connect to kernels...
r4958 self.hb_port = cfg['hb_port']
self._connection_file_written = True
Brian Granger
Creating an ABC for kernel managers and channels.
r9121
#--------------------------------------------------------------------------
Brian E. Granger
Final cleanup of kernelmanager...
r9151 # Kernel management
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 #--------------------------------------------------------------------------
MinRK
allow custom kernel_cmd in KernelManager
r9348
def format_kernel_cmd(self, **kw):
"""format templated args (e.g. {connection_file})"""
if self.kernel_cmd:
cmd = self.kernel_cmd
else:
MinRK
s/make_kernel_cmd/make_ipkernel_cmd/
r9350 cmd = make_ipkernel_cmd(
MinRK
mv IPython.zmq to IPython.kernel.zmq
r9372 'from IPython.kernel.zmq.kernelapp import main; main()',
MinRK
allow custom kernel_cmd in KernelManager
r9348 **kw
)
ns = dict(connection_file=self.connection_file)
ns.update(self._launch_args)
return [ c.format(**ns) for c in cmd ]
MinRK
allow KM._launch_kernel to be overridden in subclasses
r9349
def _launch_kernel(self, kernel_cmd, **kw):
"""actually launch the kernel
override in a subclass to launch kernel subprocesses differently
"""
return launch_kernel(kernel_cmd, **kw)
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 def start_kernel(self, **kw):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Starts a kernel on this host in a separate process.
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 If random ports (port=0) are being used, this method must be called
before the channels are created.
epatters
* The SVG payload matplotlib backend now works....
r2758
Parameters:
-----------
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 **kw : optional
MinRK
move IPython.zmq.entry_point to IPython.utils.kernel
r9352 keyword arguments that are passed down to build the kernel_cmd
and launching the kernel (e.g. Popen kwargs).
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 """
MinRK
enable IPC transport for kernels...
r7321 if self.transport == 'tcp' and self.ip not in LOCAL_IPS:
MinRK
Possible fix for GH-169
r3144 raise RuntimeError("Can only launch a kernel on a local interface. "
epatters
* Implemented a proper main() function for kernel.py that reads command line input....
r2667 "Make sure that the '*_address' attributes are "
MinRK
Possible fix for GH-169
r3144 "configured properly. "
"Currently valid addresses are: %s"%LOCAL_IPS
)
MinRK
use connection files instead of ports to connect to kernels...
r4958
# write connection file / get default ports
self.write_connection_file()
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
allow custom kernel_cmd in KernelManager
r9348 # save kwargs for use in restart
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 self._launch_args = kw.copy()
MinRK
allow custom kernel_cmd in KernelManager
r9348 # build the Popen cmd
kernel_cmd = self.format_kernel_cmd(**kw)
# launch the kernel subprocess
MinRK
allow KM._launch_kernel to be overridden in subclasses
r9349 self.kernel = self._launch_kernel(kernel_cmd,
ipython_kernel=self.ipython_kernel,
**kw)
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686
Brian Granger
Fixing bug in cleanup of ipc files and adding new to shutdown....
r9119 def shutdown_kernel(self, now=False, restart=False):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Attempts to the stop the kernel process cleanly.
This attempts to shutdown the kernels cleanly by:
1. Sending it a shutdown message over the shell channel.
2. If that fails, the kernel is shutdown forcibly by sending it
a signal.
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 Parameters:
-----------
now : bool
Should the kernel be forcible killed *now*. This skips the
first, nice shutdown attempt.
restart: bool
Will this kernel be restarted after it is shutdown. When this
is True, connection files will not be cleaned up.
epatters
* Moved shutdown_kernel method from FrontendWidget to KernelManager....
r2961 """
epatters
Adding some temporary hacks to work around (Py)ZMQ bugs on Windows.
r2995 # FIXME: Shutdown does not work on Windows due to ZMQ errors!
if sys.platform == 'win32':
Brian E. Granger
Make KernelManager.kill_kernel private....
r9130 self._kill_kernel()
epatters
Adding some temporary hacks to work around (Py)ZMQ bugs on Windows.
r2995 return
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 # Pause the heart beat channel if it exists.
if self._hb_channel is not None:
self._hb_channel.pause()
Brian Granger
Fixing bug in cleanup of ipc files and adding new to shutdown....
r9119 if now:
epatters
* Moved shutdown_kernel method from FrontendWidget to KernelManager....
r2961 if self.has_kernel:
Brian E. Granger
Make KernelManager.kill_kernel private....
r9130 self._kill_kernel()
Brian Granger
Fixing bug in cleanup of ipc files and adding new to shutdown....
r9119 else:
# Don't send any additional kernel kill messages immediately, to give
# the kernel a chance to properly execute shutdown actions. Wait for at
# most 1s, checking every 0.1s.
self.shell_channel.shutdown(restart=restart)
for i in range(10):
if self.is_alive:
time.sleep(0.1)
else:
break
else:
# OK, we've waited long enough.
if self.has_kernel:
Brian E. Granger
Make KernelManager.kill_kernel private....
r9130 self._kill_kernel()
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E. Granger
Fixing bug in connection file cleanup....
r9117 if not restart:
self.cleanup_connection_file()
Brian E. Granger
Final cleanup of kernelmanager...
r9151 self.cleanup_ipc_files()
Brian Granger
Fixing bug in cleanup of ipc files and adding new to shutdown....
r9119 else:
self.cleanup_ipc_files()
MinRK
use connection files instead of ports to connect to kernels...
r4958
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 def restart_kernel(self, now=False, **kw):
"""Restarts a kernel with the arguments that were used to launch it.
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 If the old kernel was launched with random ports, the same ports will be
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 used for the new kernel. The same connection file is used again.
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972
Parameters
----------
Fernando Perez
Rename 'instant_death' to 'now' as per code review.
r3030 now : bool, optional
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 If True, the kernel is forcefully restarted *immediately*, without
having a chance to do any cleanup action. Otherwise the kernel is
given 1s to clean up before a forceful restart is issued.
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 In all cases the kernel is restarted, the only difference is whether
it is given a chance to perform a clean shutdown or not.
**kw : optional
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 Any options specified here will overwrite those used to launch the
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 kernel.
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 """
if self._launch_args is None:
raise RuntimeError("Cannot restart the kernel. "
"No previous call to 'start_kernel'.")
else:
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 # Stop currently running kernel.
Brian Granger
Fixing bug in cleanup of ipc files and adding new to shutdown....
r9119 self.shutdown_kernel(now=now, restart=True)
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784
# Start new kernel.
self._launch_args.update(kw)
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 self.start_kernel(**self._launch_args)
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851
epatters
Adding some temporary hacks to work around (Py)ZMQ bugs on Windows.
r2995 # FIXME: Messages get dropped in Windows due to probable ZMQ bug
# unless there is some delay here.
if sys.platform == 'win32':
time.sleep(0.2)
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 @property
def has_kernel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Has a kernel been started that we are managing."""
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 return self.kernel is not None
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686
Brian E. Granger
Make KernelManager.kill_kernel private....
r9130 def _kill_kernel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Kill the running kernel.
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 This is a private method, callers should use shutdown_kernel(now=True).
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487 """
Brian Granger
Fixed inconsistent usage of has_kernel in KernelManager.
r3026 if self.has_kernel:
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 # Pause the heart beat channel if it exists.
if self._hb_channel is not None:
self._hb_channel.pause()
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487 # Signal the kernel to terminate (sends SIGKILL on Unix and calls
# TerminateProcess() on Win32).
epatters
Safe kernel killing in Windows.
r3034 try:
self.kernel.kill()
Matthias BUSSONNIER
conform to pep 3110...
r7787 except OSError as e:
epatters
Safe kernel killing in Windows.
r3034 # In Windows, we will get an Access Denied error if the process
# has already terminated. Ignore it.
epatters
Handle Unix ESRCH errors gracefully in kill_kernel.
r3827 if sys.platform == 'win32':
if e.winerror != 5:
raise
# On Unix, we may get an ESRCH error if the process has already
# terminated. Ignore it.
else:
from errno import ESRCH
if e.errno != ESRCH:
raise
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487
# Block until the kernel terminates.
self.kernel.wait()
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 self.kernel = None
epatters
Added 'start_listening' and 'stop_listening' methods to the kernel manager.
r2639 else:
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 raise RuntimeError("Cannot kill kernel. No kernel is running!")
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
epatters
Implemented kernel interrupts for Windows.
r3027 def interrupt_kernel(self):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Interrupts the kernel by sending it a signal.
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487
Unlike ``signal_kernel``, this operation is well supported on all
platforms.
epatters
Implemented kernel interrupts for Windows.
r3027 """
if self.has_kernel:
if sys.platform == 'win32':
Thomas Kluyver
Correct import for kernelmanager on Windows
r9487 from .zmq.parentpoller import ParentPollerWindows as Poller
epatters
Implemented kernel interrupts for Windows.
r3027 Poller.send_interrupt(self.kernel.win32_interrupt_event)
else:
self.kernel.send_signal(signal.SIGINT)
else:
raise RuntimeError("Cannot interrupt kernel. No kernel is running!")
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 def signal_kernel(self, signum):
Brian E. Granger
More kernelmanager docstring cleanup.
r9129 """Sends a signal to the kernel.
epatters
BUG: Block until kernel termination after sending a kill signal.
r8487
Note that since only SIGTERM is supported on Windows, this function is
only useful on Unix systems.
epatters
Implemented kernel interrupts for Windows.
r3027 """
Brian Granger
Fixed inconsistent usage of has_kernel in KernelManager.
r3026 if self.has_kernel:
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 self.kernel.send_signal(signum)
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 else:
raise RuntimeError("Cannot signal kernel. No kernel is running!")
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 @property
def is_alive(self):
"""Is the kernel process still running?"""
Brian Granger
Fixed inconsistent usage of has_kernel in KernelManager.
r3026 if self.has_kernel:
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 if self.kernel.poll() is None:
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 return True
else:
return False
MinRK
Fixes to the heartbeat channel...
r5614 elif self._hb_channel is not None:
# We didn't start the kernel with this KernelManager so we
# use the heartbeat.
return self._hb_channel.is_beating()
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 else:
MinRK
Fixes to the heartbeat channel...
r5614 # no heartbeat and not local, we can't tell if it's running,
# so naively return True
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 return True
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 #-----------------------------------------------------------------------------
# ABC Registration
#-----------------------------------------------------------------------------
Brian Granger
Added heartbeat support.
r2910
Brian Granger
Creating an ABC for kernel managers and channels.
r9121 ShellChannelABC.register(ShellChannel)
IOPubChannelABC.register(IOPubChannel)
HBChannelABC.register(HBChannel)
StdInChannelABC.register(StdInChannel)
KernelManagerABC.register(KernelManager)
Brian E. Granger
More kernelmanager docstring cleanup.
r9129