##// END OF EJS Templates
don't inject unicode into sys.argv...
don't inject unicode into sys.argv Protects %run and `ipython script.py` from getting unicode sys.argv on Python 2 closes #710

File last commit:

r4966:c3f5dd30
r5098:71d3d186
Show More
kernelmanager.py
1043 lines | 37.4 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 #-----------------------------------------------------------------------------
# Copyright (C) 2008-2010 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 # Standard library imports.
MinRK
ignore EINTR in channel loops...
r3928 import errno
Brian Granger
Work on the kernel manager.
r2606 from Queue import Queue, Empty
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
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 # System library imports.
Brian Granger
Work on the kernel manager.
r2606 import zmq
from zmq import POLLIN, POLLOUT, POLLERR
from zmq.eventloop import ioloop
MinRK
add KernelManager.load_connection_file method...
r4966 from zmq.utils import jsonapi as json
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
# Local imports.
MinRK
finish plumbing config to Session objects...
r4015 from IPython.config.loader import Config
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 (
HasTraits, Any, Instance, Type, Unicode, Int, Bool
)
MinRK
add KernelManager.load_connection_file method...
r4966 from IPython.utils.py3compat import str_to_bytes
MinRK
use connection files instead of ports to connect to kernels...
r4958 from IPython.zmq.entry_point import write_connection_file
MinRK
KernelManager has port traits instead of multiple ip/port pairs...
r4956 from session import Session
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 Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """The base class for the channels that use ZMQ sockets.
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631 """
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 context = None
session = None
socket = None
ioloop = None
iostate = None
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 _address = None
def __init__(self, context, session, address):
"""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.
address : tuple
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
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 if address[1] == 0:
epatters
* Added 'req_port' option to 'launch_kernel' and the kernel entry point....
r2702 message = 'The port number for a channel cannot be 0.'
raise InvalidPortNumber(message)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self._address = address
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()
except zmq.ZMQError as e:
if e.errno == errno.EINTR:
continue
else:
raise
else:
break
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 def stop(self):
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """Stop the channel's activity.
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):
"""Get the channel's address as an (ip, port) tuple.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 By the default, the address is (localhost, 0), where 0 means a random
port.
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 """
return self._address
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 def add_io_state(self, state):
"""Add IO state to the eventloop.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
state : zmq.POLLIN|zmq.POLLOUT|zmq.POLLERR
The IO state flag to set.
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 This is thread safe as it uses the thread safe IOLoop.add_callback.
"""
def add_io_state_callback():
if not self.iostate & state:
self.iostate = self.iostate | state
self.ioloop.update_handler(self.socket, self.iostate)
self.ioloop.add_callback(add_io_state_callback)
def drop_io_state(self, state):
"""Drop IO state from the eventloop.
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 Parameters
----------
state : zmq.POLLIN|zmq.POLLOUT|zmq.POLLERR
The IO state flag to set.
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 This is thread safe as it uses the thread safe IOLoop.add_callback.
"""
def drop_io_state_callback():
if self.iostate & state:
self.iostate = self.iostate & (~state)
self.ioloop.update_handler(self.socket, self.iostate)
self.ioloop.add_callback(drop_io_state_callback)
Brian Granger
Work on the kernel manager.
r2606
MinRK
cleanup channel names to match function not socket...
r3974 class ShellSocketChannel(ZMQSocketChannel):
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """The XREQ channel for issues 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):
MinRK
cleanup channel names to match function not socket...
r3974 super(ShellSocketChannel, self).__init__(context, session, address)
epatters
Thread safety fix in KernelManager:...
r2996 self.command_queue = Queue()
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)
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 self.socket.connect('tcp://%s:%i' % self.address)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.iostate = POLLERR|POLLIN
Bernardo B. Marques
remove all trailling spaces
r4872 self.ioloop.add_handler(self.socket, self._handle_events,
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 self.iostate)
MinRK
ignore EINTR in channel loops...
r3928 self._run_loop()
Brian Granger
Work on the kernel manager.
r2606
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 def stop(self):
self.ioloop.stop()
MinRK
cleanup channel names to match function not socket...
r3974 super(ShellSocketChannel, 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
Fernando Perez
Rework messaging to better conform to our spec....
r2926 def execute(self, code, silent=False,
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)
If set, the kernel will execute the code as quietly possible.
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
A dict with string keys and 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.
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 allow_stdin : bool, optional
Flag for
A dict with string keys and 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.
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.
Fernando Perez
Rework messaging to better conform to our spec....
r2926 content = dict(code=code, silent=silent,
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)
self._queue_request(msg)
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)
self._queue_request(msg)
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 def object_info(self, oname):
"""Get metadata information about an object.
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.
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.
"""
content = dict(oname=oname)
msg = self.session.msg('object_info_request', content)
self._queue_request(msg)
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):
"""Get entries from the 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)
epatters
* Added support for prompt and history requests to the kernel manager and Qt console frontend....
r2844 self._queue_request(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})
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 self._queue_request(msg)
return msg['header']['msg_id']
Brian Granger
Work on the kernel manager.
r2606 def _handle_events(self, socket, events):
if events & POLLERR:
self._handle_err()
if events & POLLOUT:
self._handle_send()
if events & POLLIN:
self._handle_recv()
def _handle_recv(self):
MinRK
all sends/recvs now via Session.send/recv....
r3269 ident,msg = self.session.recv(self.socket, 0)
epatters
Initial checkin of Qt kernel manager. Began refactor of FrontendWidget.
r2609 self.call_handlers(msg)
Brian Granger
Work on the kernel manager.
r2606
def _handle_send(self):
try:
msg = self.command_queue.get(False)
except Empty:
pass
else:
MinRK
all sends/recvs now via Session.send/recv....
r3269 self.session.send(self.socket,msg)
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 if self.command_queue.empty():
self.drop_io_state(POLLOUT)
Brian Granger
Work on the kernel manager.
r2606
def _handle_err(self):
Brian Granger
General cleanup of kernelmanager.py....
r2692 # We don't want to let this go silently, so eventually we should log.
Brian Granger
SUB channel _handle_recv is now greedy....
r2694 raise zmq.ZMQError()
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 def _queue_request(self, msg):
Brian Granger
Work on the kernel manager.
r2606 self.command_queue.put(msg)
Brian Granger
Fixed high CPU usage of XREQ channel....
r2695 self.add_io_state(POLLOUT)
Brian Granger
Work on the kernel manager.
r2606
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
MinRK
cleanup channel names to match function not socket...
r3974 class SubSocketChannel(ZMQSocketChannel):
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """The SUB channel which listens for messages that the kernel publishes.
"""
def __init__(self, context, session, address):
super(SubSocketChannel, 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)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.socket.connect('tcp://%s:%i' % self.address)
self.iostate = POLLIN|POLLERR
Bernardo B. Marques
remove all trailling spaces
r4872 self.ioloop.add_handler(self.socket, self._handle_events,
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.iostate)
MinRK
ignore EINTR in channel loops...
r3928 self._run_loop()
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699
def stop(self):
self.ioloop.stop()
super(SubSocketChannel, self).stop()
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):
"""Immediately processes all pending messages on the SUB 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 _handle_events(self, socket, events):
# Turn on and off POLLOUT depending on if we have made a request
if events & POLLERR:
self._handle_err()
if events & POLLIN:
self._handle_recv()
def _handle_err(self):
# We don't want to let this go silently, so eventually we should log.
raise zmq.ZMQError()
def _handle_recv(self):
# Get all of the messages we can
while True:
try:
MinRK
all sends/recvs now via Session.send/recv....
r3269 ident,msg = self.session.recv(self.socket)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 except zmq.ZMQError:
# Check the errno?
Brian Granger
Minor work on kernelmanager....
r2742 # Will this trigger POLLERR?
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 break
else:
MinRK
all sends/recvs now via Session.send/recv....
r3269 if msg is None:
break
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.call_handlers(msg)
def _flush(self):
"""Callback for :method:`self.flush`."""
self._flushed = True
Brian Granger
Work on the kernel manager.
r2606
MinRK
cleanup channel names to match function not socket...
r3974 class StdInSocketChannel(ZMQSocketChannel):
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 """A reply 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):
MinRK
cleanup channel names to match function not socket...
r3974 super(StdInSocketChannel, self).__init__(context, session, address)
epatters
Thread safety fix in KernelManager:...
r2996 self.ioloop = ioloop.IOLoop()
self.msg_queue = Queue()
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)
epatters
Basic raw_input implementation is now working.
r2707 self.socket.connect('tcp://%s:%i' % self.address)
self.iostate = POLLERR|POLLIN
Bernardo B. Marques
remove all trailling spaces
r4872 self.ioloop.add_handler(self.socket, self._handle_events,
epatters
Basic raw_input implementation is now working.
r2707 self.iostate)
MinRK
ignore EINTR in channel loops...
r3928 self._run_loop()
epatters
Merge branch 'kernelmanager' of git://github.com/ellisonbg/ipython into qtfrontend. Fixed breakage and conflicts from merge....
r2701
def stop(self):
self.ioloop.stop()
MinRK
cleanup channel names to match function not socket...
r3974 super(StdInSocketChannel, 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)
epatters
Basic raw_input implementation is now working.
r2707 self._queue_reply(msg)
def _handle_events(self, socket, events):
if events & POLLERR:
self._handle_err()
if events & POLLOUT:
self._handle_send()
if events & POLLIN:
self._handle_recv()
def _handle_recv(self):
MinRK
all sends/recvs now via Session.send/recv....
r3269 ident,msg = self.session.recv(self.socket, 0)
epatters
Basic raw_input implementation is now working.
r2707 self.call_handlers(msg)
def _handle_send(self):
try:
msg = self.msg_queue.get(False)
except Empty:
pass
else:
MinRK
all sends/recvs now via Session.send/recv....
r3269 self.session.send(self.socket,msg)
epatters
Basic raw_input implementation is now working.
r2707 if self.msg_queue.empty():
self.drop_io_state(POLLOUT)
def _handle_err(self):
# We don't want to let this go silently, so eventually we should log.
raise zmq.ZMQError()
def _queue_reply(self, msg):
self.msg_queue.put(msg)
self.add_io_state(POLLOUT)
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
MinRK
cleanup channel names to match function not socket...
r3974 class HBSocketChannel(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
Brian Granger
Added heartbeat support.
r2910
def __init__(self, context, session, address):
super(HBSocketChannel, self).__init__(context, session, address)
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 self._running = False
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 self._pause = True
Brian Granger
Added heartbeat support.
r2910
def _create_socket(self):
self.socket = self.context.socket(zmq.REQ)
MinRK
add Session.bsession trait for session id as bytes
r4770 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
Brian Granger
Added heartbeat support.
r2910 self.socket.connect('tcp://%s:%i' % self.address)
self.poller = zmq.Poller()
self.poller.register(self.socket, zmq.POLLIN)
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
while self._running:
Brian Granger
Added pausing to the heartbeat channel.
r3023 if self._pause:
time.sleep(self.time_to_dead)
Brian Granger
Added heartbeat support.
r2910 else:
Brian Granger
Added pausing to the heartbeat channel.
r3023 since_last_heartbeat = 0.0
request_time = time.time()
try:
#io.rprint('Ping from HB channel') # dbg
MinRK
all sends/recvs now via Session.send/recv....
r3269 self.socket.send(b'ping')
Brian Granger
Added pausing to the heartbeat channel.
r3023 except zmq.ZMQError, e:
#io.rprint('*** HB Error:', e) # dbg
if e.errno == zmq.EFSM:
#io.rprint('sleep...', self.time_to_dead) # dbg
time.sleep(self.time_to_dead)
self._create_socket()
else:
raise
else:
while True:
try:
MinRK
all sends/recvs now via Session.send/recv....
r3269 self.socket.recv(zmq.NOBLOCK)
Brian Granger
Added pausing to the heartbeat channel.
r3023 except zmq.ZMQError, e:
#io.rprint('*** HB Error 2:', e) # dbg
if e.errno == zmq.EAGAIN:
before_poll = time.time()
until_dead = self.time_to_dead - (before_poll -
request_time)
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 # When the return value of poll() is an empty
# list, that is when things have gone wrong
# (zeromq bug). As long as it is not an empty
# list, poll is working correctly even if it
# returns quickly. Note: poll timeout is in
# milliseconds.
epatters
Fix serious bug in heartbeat logic that can result in no-timeout polls.
r3831 if until_dead > 0.0:
MinRK
ignore EINTR in channel loops...
r3928 while True:
try:
self.poller.poll(1000 * until_dead)
except zmq.ZMQError as e:
if e.errno == errno.EINTR:
continue
else:
raise
else:
break
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Integrated the heart beat pausing/unpausing logic with the (Qt)KernelManager.
r3032 since_last_heartbeat = time.time()-request_time
Brian Granger
Added pausing to the heartbeat channel.
r3023 if since_last_heartbeat > self.time_to_dead:
self.call_handlers(since_last_heartbeat)
break
else:
# FIXME: We should probably log this instead.
raise
Brian Granger
Added heartbeat support.
r2910 else:
Brian Granger
Added pausing to the heartbeat channel.
r3023 until_dead = self.time_to_dead - (time.time() -
request_time)
if until_dead > 0.0:
#io.rprint('sleep...', self.time_to_dead) # dbg
time.sleep(until_dead)
break
def pause(self):
"""Pause the heartbeat."""
self._pause = True
def unpause(self):
"""Unpause the heartbeat."""
self._pause = False
def is_beating(self):
"""Is the heartbeat running and not paused."""
if self.is_alive() and not self._pause:
return True
else:
return False
Brian Granger
Added heartbeat support.
r2910
epatters
* Fixed heartbeat thread not stopping cleanly....
r2915 def stop(self):
self._running = False
super(HBSocketChannel, self).stop()
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
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 #-----------------------------------------------------------------------------
# Main kernel manager class
#-----------------------------------------------------------------------------
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 class KernelManager(HasTraits):
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631 """ Manages a kernel for a frontend.
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631 The SUB channel is for the frontend to receive messages published by the
kernel.
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631 The REQ channel is for the frontend to make requests of the kernel.
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Cleaned up KernelManager interface and clarified documentation.
r2631 The REP channel is for the kernel to request stdin (raw_input) from the
frontend.
"""
MinRK
finish plumbing config to Session objects...
r4015 # config object for passing to child configurables
config = Instance(Config)
Bernardo B. Marques
remove all trailling spaces
r4872
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
* 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.
kernel = Instance(Popen)
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
KernelManager has port traits instead of multiple ip/port pairs...
r4956 ip = Unicode(LOCALHOST)
shell_port = Int(0)
MinRK
fix remaining sub_port -> iopub_port in kernelmanager
r4959 iopub_port = Int(0)
MinRK
KernelManager has port traits instead of multiple ip/port pairs...
r4956 stdin_port = Int(0)
hb_port = Int(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.
MinRK
cleanup channel names to match function not socket...
r3974 shell_channel_class = Type(ShellSocketChannel)
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 sub_channel_class = Type(SubSocketChannel)
MinRK
cleanup channel names to match function not socket...
r3974 stdin_channel_class = Type(StdInSocketChannel)
Brian Granger
Added heartbeat support.
r2910 hb_channel_class = Type(HBSocketChannel)
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
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 _sub_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)
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
Brian Granger
Draft of context closing....
r3046 def __init__(self, **kwargs):
super(KernelManager, self).__init__(**kwargs)
MinRK
finish plumbing config to Session objects...
r4015 if self.session is None:
self.session = Session(config=self.config)
MinRK
use connection files instead of ports to connect to kernels...
r4958
def __del__(self):
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)
except IOError:
pass
Brian Granger
Draft of context closing....
r3046
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
MinRK
cleanup channel names to match function not socket...
r3974 def start_channels(self, shell=True, sub=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
them. 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()
epatters
* Added support to KernelManager for starting a subset of the four channels....
r2994 if sub:
self.sub_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 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()
epatters
* Added support to KernelManager for starting a subset of the four channels....
r2994 if self.sub_channel.is_alive():
self.sub_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?"""
MinRK
cleanup channel names to match function not socket...
r3974 return (self.shell_channel.is_alive() or self.sub_channel.is_alive() or
self.stdin_channel.is_alive() or self.hb_channel.is_alive())
epatters
Added 'start_listening' and 'stop_listening' methods to the kernel manager.
r2639
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 #--------------------------------------------------------------------------
# Kernel process management methods:
#--------------------------------------------------------------------------
MinRK
use connection files instead of ports to connect to kernels...
r4958
MinRK
add KernelManager.load_connection_file method...
r4966 def load_connection_file(self):
"""load connection info from JSON dict in self.connection_file"""
with open(self.connection_file) as f:
cfg = json.loads(f.read())
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):
MinRK
add KernelManager.load_connection_file method...
r4966 """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,
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
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 def start_kernel(self, **kw):
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686 """Starts a kernel process and configures the manager to use it.
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
* Restored functionality after major merge....
r2778 ipython : bool, optional (default True)
Whether to use an IPython kernel instead of a plain Python kernel.
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784
epatters
Add parameter for custom launch function to KernelManager.start_kernel.
r4509 launcher : callable, optional (default None)
A custom function for launching the kernel process (generally a
wrapper around ``entry_point.base_launch_kernel``). In most cases,
it should not be necessary to use this parameter.
epatters
Make 'restart_kernel' method more convenient + docstring improvements.
r3784 **kw : optional
See respective options for IPython and Python kernels.
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 """
MinRK
KernelManager has port traits instead of multiple ip/port pairs...
r4956 if 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
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 self._launch_args = kw.copy()
epatters
Add parameter for custom launch function to KernelManager.start_kernel.
r4509 launch_kernel = kw.pop('launcher', None)
if launch_kernel is None:
if kw.pop('ipython', True):
from ipkernel import launch_kernel
else:
from pykernel import launch_kernel
MinRK
use connection files instead of ports to connect to kernels...
r4958 self.kernel = launch_kernel(fname=self.connection_file, **kw)
epatters
* Implemented KernelManager's 'signal_kernel' method....
r2686
MinRK
added reset:<bool> to shutdown_request content; shutdown_message broadcast on PUB for multiclient notification
r3089 def shutdown_kernel(self, restart=False):
epatters
* Moved shutdown_kernel method from FrontendWidget to KernelManager....
r2961 """ Attempts to the stop the kernel process cleanly. If the kernel
cannot be stopped, it is killed, if possible.
"""
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':
self.kill_kernel()
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()
epatters
* Moved shutdown_kernel method from FrontendWidget to KernelManager....
r2961 # Don't send any additional kernel kill messages immediately, to give
# the kernel a chance to properly execute shutdown actions. Wait for at
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 # most 1s, checking every 0.1s.
MinRK
cleanup channel names to match function not socket...
r3974 self.shell_channel.shutdown(restart=restart)
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 for i in range(10):
epatters
* Moved shutdown_kernel method from FrontendWidget to KernelManager....
r2961 if self.is_alive:
time.sleep(0.1)
else:
break
else:
# OK, we've waited long enough.
if self.has_kernel:
self.kill_kernel()
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
use connection files instead of ports to connect to kernels...
r4958 if not restart and 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)
except IOError:
pass
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
used for the new kernel.
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
Any options specified here will replace those used to launch the
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.
epatters
First cut at allowing the kernel to be restarted from the frontend.
r2851 if self.has_kernel:
Fernando Perez
Rename 'instant_death' to 'now' as per code review.
r3030 if now:
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 self.kill_kernel()
else:
MinRK
added reset:<bool> to shutdown_request content; shutdown_message broadcast on PUB for multiclient notification
r3089 self.shutdown_kernel(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):
"""Returns whether a kernel process has been specified for the kernel
manager.
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 """
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
def kill_kernel(self):
""" Kill the running kernel. """
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
Safe kernel killing in Windows.
r3034 # Attempt to kill the kernel.
try:
self.kernel.kill()
except OSError, e:
# 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
* 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):
""" Interrupts the kernel. Unlike ``signal_kernel``, this operation is
well supported on all platforms.
"""
if self.has_kernel:
if sys.platform == 'win32':
from parentpoller import ParentPollerWindows as Poller
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):
epatters
Implemented kernel interrupts for Windows.
r3027 """ Sends a signal to the kernel. Note that since only SIGTERM is
supported on Windows, this function is only useful on Unix systems.
"""
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?"""
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 # FIXME: not using a heartbeat means this method is broken for any
# remote kernel, it's only capable of handling local kernels.
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
else:
# We didn't start the kernel with this KernelManager so we don't
# know if it is running. We should use a heartbeat for this case.
return True
epatters
* Added 'stop' methods to the ZmqSocketChannels...
r2632 #--------------------------------------------------------------------------
# Channels used for communication with the kernel:
#--------------------------------------------------------------------------
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 @property
MinRK
cleanup channel names to match function not socket...
r3974 def shell_channel(self):
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 """Get the REQ socket channel object to make requests of the kernel."""
MinRK
cleanup channel names to match function not socket...
r3974 if self._shell_channel is None:
self._shell_channel = self.shell_channel_class(self.context,
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.session,
MinRK
KernelManager has port traits instead of multiple ip/port pairs...
r4956 (self.ip, self.shell_port))
MinRK
cleanup channel names to match function not socket...
r3974 return self._shell_channel
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611
@property
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 def sub_channel(self):
"""Get the SUB socket channel object."""
if self._sub_channel is None:
self._sub_channel = self.sub_channel_class(self.context,
self.session,
MinRK
fix remaining sub_port -> iopub_port in kernelmanager
r4959 (self.ip, self.iopub_port))
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 return self._sub_channel
@property
MinRK
cleanup channel names to match function not socket...
r3974 def stdin_channel(self):
epatters
* Refactored KernelManager to use Traitlets and to have its channels as attributes...
r2611 """Get the REP socket channel object to handle stdin (raw_input)."""
MinRK
cleanup channel names to match function not socket...
r3974 if self._stdin_channel is None:
self._stdin_channel = self.stdin_channel_class(self.context,
Brian Granger
Kernel manager is cleaned up and simplified. Still bugs though.
r2699 self.session,
MinRK
KernelManager has port traits instead of multiple ip/port pairs...
r4956 (self.ip, self.stdin_port))
MinRK
cleanup channel names to match function not socket...
r3974 return self._stdin_channel
Brian Granger
Added heartbeat support.
r2910
@property
def hb_channel(self):
Thomas Kluyver
Correction to docstring...
r3360 """Get the heartbeat socket channel object to check that the
kernel is alive."""
Brian Granger
Added heartbeat support.
r2910 if self._hb_channel is None:
Bernardo B. Marques
remove all trailling spaces
r4872 self._hb_channel = self.hb_channel_class(self.context,
Brian Granger
Added heartbeat support.
r2910 self.session,
MinRK
KernelManager has port traits instead of multiple ip/port pairs...
r4956 (self.ip, self.hb_port))
Brian Granger
Added heartbeat support.
r2910 return self._hb_channel