|
|
"""A basic in process kernel monitor with autorestarting.
|
|
|
|
|
|
This watches a kernel's state using KernelManager.is_alive and auto
|
|
|
restarts the kernel if it dies.
|
|
|
"""
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# 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 __future__ import absolute_import
|
|
|
|
|
|
import zmq
|
|
|
from zmq.eventloop import ioloop
|
|
|
|
|
|
|
|
|
from IPython.kernel.restarter import KernelRestarter
|
|
|
from IPython.utils.traitlets import (
|
|
|
Instance, Float, List,
|
|
|
)
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Code
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
class IOLoopKernelRestarter(KernelRestarter):
|
|
|
"""Monitor and autorestart a kernel."""
|
|
|
|
|
|
loop = Instance('zmq.eventloop.ioloop.IOLoop', allow_none=False)
|
|
|
def _loop_default(self):
|
|
|
return ioloop.IOLoop.instance()
|
|
|
|
|
|
time_to_dead = Float(3.0, config=True,
|
|
|
help="""Kernel heartbeat interval in seconds."""
|
|
|
)
|
|
|
|
|
|
_pcallback = None
|
|
|
|
|
|
def start(self):
|
|
|
"""Start the polling of the kernel."""
|
|
|
if self._pcallback is None:
|
|
|
self._pcallback = ioloop.PeriodicCallback(
|
|
|
self.poll, 1000*self.time_to_dead, self.loop
|
|
|
)
|
|
|
self._pcallback.start()
|
|
|
|
|
|
def stop(self):
|
|
|
"""Stop the kernel polling."""
|
|
|
if self._pcallback is not None:
|
|
|
self._pcallback.stop()
|
|
|
self._pcallback = None
|
|
|
|
|
|
|