manager.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """A kernel manager for in-process kernels."""
  2. # Copyright (c) IPython Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. from traitlets import Instance, DottedObjectName, default
  5. from jupyter_client.managerabc import KernelManagerABC
  6. from jupyter_client.manager import KernelManager
  7. from jupyter_client.session import Session
  8. from .constants import INPROCESS_KEY
  9. class InProcessKernelManager(KernelManager):
  10. """A manager for an in-process kernel.
  11. This class implements the interface of
  12. `jupyter_client.kernelmanagerabc.KernelManagerABC` and allows
  13. (asynchronous) frontends to be used seamlessly with an in-process kernel.
  14. See `jupyter_client.kernelmanager.KernelManager` for docstrings.
  15. """
  16. # The kernel process with which the KernelManager is communicating.
  17. kernel = Instance('ipykernel.inprocess.ipkernel.InProcessKernel',
  18. allow_none=True)
  19. # the client class for KM.client() shortcut
  20. client_class = DottedObjectName('ipykernel.inprocess.BlockingInProcessKernelClient')
  21. @default('blocking_class')
  22. def _default_blocking_class(self):
  23. from .blocking import BlockingInProcessKernelClient
  24. return BlockingInProcessKernelClient
  25. @default('session')
  26. def _default_session(self):
  27. # don't sign in-process messages
  28. return Session(key=INPROCESS_KEY, parent=self)
  29. #--------------------------------------------------------------------------
  30. # Kernel management methods
  31. #--------------------------------------------------------------------------
  32. def start_kernel(self, **kwds):
  33. from ipykernel.inprocess.ipkernel import InProcessKernel
  34. self.kernel = InProcessKernel(parent=self, session=self.session)
  35. def shutdown_kernel(self):
  36. self.kernel.iopub_thread.stop()
  37. self._kill_kernel()
  38. def restart_kernel(self, now=False, **kwds):
  39. self.shutdown_kernel()
  40. self.start_kernel(**kwds)
  41. @property
  42. def has_kernel(self):
  43. return self.kernel is not None
  44. def _kill_kernel(self):
  45. self.kernel = None
  46. def interrupt_kernel(self):
  47. raise NotImplementedError("Cannot interrupt in-process kernel.")
  48. def signal_kernel(self, signum):
  49. raise NotImplementedError("Cannot signal in-process kernel.")
  50. def is_alive(self):
  51. return self.kernel is not None
  52. def client(self, **kwargs):
  53. kwargs['kernel'] = self.kernel
  54. return super(InProcessKernelManager, self).client(**kwargs)
  55. #-----------------------------------------------------------------------------
  56. # ABC Registration
  57. #-----------------------------------------------------------------------------
  58. KernelManagerABC.register(InProcessKernelManager)