"""A kernel manager with a tornado IOLoop""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from tornado import ioloop from traitlets import Instance from traitlets import Type from zmq.eventloop.zmqstream import ZMQStream from .restarter import AsyncIOLoopKernelRestarter from .restarter import IOLoopKernelRestarter from jupyter_client.manager import AsyncKernelManager from jupyter_client.manager import KernelManager def as_zmqstream(f): def wrapped(self, *args, **kwargs): socket = f(self, *args, **kwargs) return ZMQStream(socket, self.loop) return wrapped class IOLoopKernelManager(KernelManager): loop = Instance("tornado.ioloop.IOLoop") def _loop_default(self): return ioloop.IOLoop.current() restarter_class = Type( default_value=IOLoopKernelRestarter, klass=IOLoopKernelRestarter, help=( "Type of KernelRestarter to use. " "Must be a subclass of IOLoopKernelRestarter.\n" "Override this to customize how kernel restarts are managed." ), config=True, ) _restarter = Instance("jupyter_client.ioloop.IOLoopKernelRestarter", allow_none=True) def start_restarter(self): if self.autorestart and self.has_kernel: if self._restarter is None: self._restarter = self.restarter_class( kernel_manager=self, loop=self.loop, parent=self, log=self.log ) self._restarter.start() def stop_restarter(self): if self.autorestart: if self._restarter is not None: self._restarter.stop() connect_shell = as_zmqstream(KernelManager.connect_shell) connect_control = as_zmqstream(KernelManager.connect_control) connect_iopub = as_zmqstream(KernelManager.connect_iopub) connect_stdin = as_zmqstream(KernelManager.connect_stdin) connect_hb = as_zmqstream(KernelManager.connect_hb) class AsyncIOLoopKernelManager(AsyncKernelManager): loop = Instance("tornado.ioloop.IOLoop") def _loop_default(self): return ioloop.IOLoop.current() restarter_class = Type( default_value=AsyncIOLoopKernelRestarter, klass=AsyncIOLoopKernelRestarter, help=( "Type of KernelRestarter to use. " "Must be a subclass of AsyncIOLoopKernelManager.\n" "Override this to customize how kernel restarts are managed." ), config=True, ) _restarter = Instance("jupyter_client.ioloop.AsyncIOLoopKernelRestarter", allow_none=True) def start_restarter(self): if self.autorestart and self.has_kernel: if self._restarter is None: self._restarter = self.restarter_class( kernel_manager=self, loop=self.loop, parent=self, log=self.log ) self._restarter.start() def stop_restarter(self): if self.autorestart: if self._restarter is not None: self._restarter.stop() connect_shell = as_zmqstream(AsyncKernelManager.connect_shell) connect_control = as_zmqstream(AsyncKernelManager.connect_control) connect_iopub = as_zmqstream(AsyncKernelManager.connect_iopub) connect_stdin = as_zmqstream(AsyncKernelManager.connect_stdin) connect_hb = as_zmqstream(AsyncKernelManager.connect_hb)