##// END OF EJS Templates
Save and Checkpoint
Save and Checkpoint

File last commit:

r10355:7334b686
r10513:156594a7
Show More
kernelmanager.py
110 lines | 4.1 KiB | text/x-python | PythonLexer
MinRK
move multikernelmanager to IPython.kernel
r9371 """A kernel manager relating notebooks and kernels
Brian E. Granger
More review changes....
r4609
Authors:
* Brian Granger
"""
Brian E. Granger
Refactored htmlnotebook session and kernel manager....
r4343
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
MinRK
move multikernelmanager to IPython.kernel
r9371 # Copyright (C) 2013 The IPython Development Team
Brian E. Granger
Updating the notebook to work with the latex master....
r4348 #
# Distributed under the terms of the BSD License. The full license is in
Brian E. Granger
More review changes....
r4609 # the file COPYING, distributed as part of this software.
Brian E. Granger
Updating the notebook to work with the latex master....
r4348 #-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # Imports
#-----------------------------------------------------------------------------
Brian E. Granger
Adding kernel/notebook associations.
r4494 from tornado import web
MinRK
move multikernelmanager to IPython.kernel
r9371 from IPython.kernel.multikernelmanager import MultiKernelManager
MinRK
make MultiKernelManager.kernel_manager_class configurable...
r6317 from IPython.utils.traitlets import (
Brian E. Granger
Removing heartbeat config from the MappingKernelManager.
r10277 Dict, List, Unicode, Integer,
MinRK
make MultiKernelManager.kernel_manager_class configurable...
r6317 )
Brian E. Granger
Starting to refactor heart beating of notebook kernels.
r10273
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
Brian Granger
Work on the server side of the html notebook.
r4297
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545
MinRK
use zmq.KernelManager to manage individual kernels in notebook...
r4960 class MappingKernelManager(MultiKernelManager):
MinRK
cleanup IPython handler settings...
r10355 """A KernelManager that handles notebook mapping and HTTP error handling"""
Brian E. Granger
Adding kernel/notebook associations.
r4494
MinRK
cleanup boundaries of MultiKernelManager and KernelRestarter classes...
r10295 def _kernel_manager_class_default(self):
return "IPython.kernel.ioloop.IOLoopKernelManager"
Brian E. Granger
Adding kernel/notebook associations.
r4494 kernel_argv = List(Unicode)
MinRK
add first_beat delay to notebook heartbeats...
r5812
Brian E. Granger
Adding kernel/notebook associations.
r4494 _notebook_mapping = Dict()
#-------------------------------------------------------------------------
# Methods for managing kernels and sessions
#-------------------------------------------------------------------------
Brian E. Granger
Fixed subtle bug in kernel restarting....
r4495 def kernel_for_notebook(self, notebook_id):
"""Return the kernel_id for a notebook_id or None."""
return self._notebook_mapping.get(notebook_id)
def set_kernel_for_notebook(self, notebook_id, kernel_id):
"""Associate a notebook with a kernel."""
if notebook_id is not None:
self._notebook_mapping[notebook_id] = kernel_id
Brian E. Granger
Adding kernel/notebook associations.
r4494 def notebook_for_kernel(self, kernel_id):
Brian E. Granger
Fixed subtle bug in kernel restarting....
r4495 """Return the notebook_id for a kernel_id or None."""
MinRK
handle failed kernel restart in the notebook
r10321 for notebook_id, kid in self._notebook_mapping.iteritems():
if kernel_id == kid:
return notebook_id
return None
Brian E. Granger
Adding kernel/notebook associations.
r4494
def delete_mapping_for_kernel(self, kernel_id):
Brian E. Granger
Fixed subtle bug in kernel restarting....
r4495 """Remove the kernel/notebook mapping for kernel_id."""
Brian E. Granger
Adding kernel/notebook associations.
r4494 notebook_id = self.notebook_for_kernel(kernel_id)
if notebook_id is not None:
del self._notebook_mapping[notebook_id]
MinRK
handle failed kernel restart in the notebook
r10321 def _handle_kernel_died(self, kernel_id):
"""notice that a kernel died"""
self.log.warn("Kernel %s died, removing from map.", kernel_id)
self.delete_mapping_for_kernel(kernel_id)
self.remove_kernel(kernel_id, now=True)
MinRK
use notebook-dir as cwd for kernels
r7558 def start_kernel(self, notebook_id=None, **kwargs):
MinRK
delete notebook mapping in shutdown_kernel
r10330 """Start a kernel for a notebook an return its kernel_id.
Brian E. Granger
Fixed subtle bug in kernel restarting....
r4495
Parameters
----------
notebook_id : uuid
The uuid of the notebook to associate the new kernel with. If this
is not None, this kernel will be persistent whenever the notebook
requests a kernel.
"""
kernel_id = self.kernel_for_notebook(notebook_id)
Brian E. Granger
Adding kernel/notebook associations.
r4494 if kernel_id is None:
kwargs['extra_arguments'] = self.kernel_argv
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 kernel_id = super(MappingKernelManager, self).start_kernel(**kwargs)
Brian E. Granger
Fixed subtle bug in kernel restarting....
r4495 self.set_kernel_for_notebook(notebook_id, kernel_id)
self.log.info("Kernel started: %s" % kernel_id)
Brian E. Granger
Adding kernel/notebook associations.
r4494 self.log.debug("Kernel args: %r" % kwargs)
MinRK
handle failed kernel restart in the notebook
r10321 # register callback for failed auto-restart
self.add_restart_callback(kernel_id,
lambda : self._handle_kernel_died(kernel_id),
'dead',
)
Brian E. Granger
Adding kernel/notebook associations.
r4494 else:
self.log.info("Using existing kernel: %s" % kernel_id)
MinRK
handle failed kernel restart in the notebook
r10321
Brian E. Granger
Adding kernel/notebook associations.
r4494 return kernel_id
MinRK
delete notebook mapping in shutdown_kernel
r10330 def shutdown_kernel(self, kernel_id, now=False):
"""Shutdown a kernel by kernel_id"""
super(MappingKernelManager, self).shutdown_kernel(kernel_id, now=now)
self.delete_mapping_for_kernel(kernel_id)
MinRK
cleanup boundaries of MultiKernelManager and KernelRestarter classes...
r10295 # override _check_kernel_id to raise 404 instead of KeyError
Brian E. Granger
Adding messages to HTTPError raising....
r4676 def _check_kernel_id(self, kernel_id):
"""Check a that a kernel_id exists and raise 404 if not."""
if kernel_id not in self:
raise web.HTTPError(404, u'Kernel does not exist: %s' % kernel_id)