manager.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. """A kernel manager with a tornado IOLoop"""
  2. # Copyright (c) Jupyter Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. from __future__ import absolute_import
  5. from zmq.eventloop import ioloop
  6. from zmq.eventloop.zmqstream import ZMQStream
  7. from traitlets import (
  8. Instance,
  9. Type,
  10. )
  11. from jupyter_client.manager import KernelManager
  12. from .restarter import IOLoopKernelRestarter
  13. def as_zmqstream(f):
  14. def wrapped(self, *args, **kwargs):
  15. socket = f(self, *args, **kwargs)
  16. return ZMQStream(socket, self.loop)
  17. return wrapped
  18. class IOLoopKernelManager(KernelManager):
  19. loop = Instance('tornado.ioloop.IOLoop')
  20. def _loop_default(self):
  21. return ioloop.IOLoop.current()
  22. restarter_class = Type(
  23. default_value=IOLoopKernelRestarter,
  24. klass=IOLoopKernelRestarter,
  25. help=(
  26. 'Type of KernelRestarter to use. '
  27. 'Must be a subclass of IOLoopKernelRestarter.\n'
  28. 'Override this to customize how kernel restarts are managed.'
  29. ),
  30. config=True,
  31. )
  32. _restarter = Instance('jupyter_client.ioloop.IOLoopKernelRestarter', allow_none=True)
  33. def start_restarter(self):
  34. if self.autorestart and self.has_kernel:
  35. if self._restarter is None:
  36. self._restarter = self.restarter_class(
  37. kernel_manager=self, loop=self.loop,
  38. parent=self, log=self.log
  39. )
  40. self._restarter.start()
  41. def stop_restarter(self):
  42. if self.autorestart:
  43. if self._restarter is not None:
  44. self._restarter.stop()
  45. connect_shell = as_zmqstream(KernelManager.connect_shell)
  46. connect_control = as_zmqstream(KernelManager.connect_control)
  47. connect_iopub = as_zmqstream(KernelManager.connect_iopub)
  48. connect_stdin = as_zmqstream(KernelManager.connect_stdin)
  49. connect_hb = as_zmqstream(KernelManager.connect_hb)