|
|
"""A kernel manager for in-process kernels."""
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Copyright (C) 2013 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
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
from IPython.utils.traitlets import Instance, DottedObjectName
|
|
|
from IPython.kernel.managerabc import KernelManagerABC
|
|
|
from IPython.kernel.manager import KernelManager
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Main kernel manager class
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
class InProcessKernelManager(KernelManager):
|
|
|
"""A manager for an in-process kernel.
|
|
|
|
|
|
This class implements the interface of
|
|
|
`IPython.kernel.kernelmanagerabc.KernelManagerABC` and allows
|
|
|
(asynchronous) frontends to be used seamlessly with an in-process kernel.
|
|
|
|
|
|
See `IPython.kernel.kernelmanager.KernelManager` for docstrings.
|
|
|
"""
|
|
|
|
|
|
# The kernel process with which the KernelManager is communicating.
|
|
|
kernel = Instance('IPython.kernel.inprocess.ipkernel.InProcessKernel')
|
|
|
# the client class for KM.client() shortcut
|
|
|
client_class = DottedObjectName('IPython.kernel.inprocess.BlockingInProcessKernelClient')
|
|
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
# Kernel management methods
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
|
|
def start_kernel(self, **kwds):
|
|
|
from IPython.kernel.inprocess.ipkernel import InProcessKernel
|
|
|
self.kernel = InProcessKernel()
|
|
|
|
|
|
def shutdown_kernel(self):
|
|
|
self._kill_kernel()
|
|
|
|
|
|
def restart_kernel(self, now=False, **kwds):
|
|
|
self.shutdown_kernel()
|
|
|
self.start_kernel(**kwds)
|
|
|
|
|
|
@property
|
|
|
def has_kernel(self):
|
|
|
return self.kernel is not None
|
|
|
|
|
|
def _kill_kernel(self):
|
|
|
self.kernel = None
|
|
|
|
|
|
def interrupt_kernel(self):
|
|
|
raise NotImplementedError("Cannot interrupt in-process kernel.")
|
|
|
|
|
|
def signal_kernel(self, signum):
|
|
|
raise NotImplementedError("Cannot signal in-process kernel.")
|
|
|
|
|
|
def is_alive(self):
|
|
|
return self.kernel is not None
|
|
|
|
|
|
def client(self, **kwargs):
|
|
|
kwargs['kernel'] = self.kernel
|
|
|
return super(InProcessKernelManager, self).client(**kwargs)
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# ABC Registration
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
KernelManagerABC.register(InProcessKernelManager)
|
|
|
|