##// END OF EJS Templates
fire 'dead' callbacks when kernel dies before its first heartbeat
MinRK -
Show More
@@ -19,7 +19,7 It is an incomplete base class, and must be subclassed.
19 19
20 20 from IPython.config.configurable import LoggingConfigurable
21 21 from IPython.utils.traitlets import (
22 Instance, Float, Dict,
22 Instance, Float, Dict, Bool,
23 23 )
24 24
25 25 #-----------------------------------------------------------------------------
@@ -34,6 +34,9 class KernelRestarter(LoggingConfigurable):
34 34 time_to_dead = Float(3.0, config=True,
35 35 help="""Kernel heartbeat interval in seconds."""
36 36 )
37
38 _restarting = Bool(True)
39
37 40 callbacks = Dict()
38 41 def _callbacks_default(self):
39 42 return dict(restart=[], dead=[])
@@ -71,13 +74,23 class KernelRestarter(LoggingConfigurable):
71 74 except ValueError:
72 75 pass
73 76
77 def _fire_callbacks(self, event):
78 """fire our callbacks for a particular event"""
79 for callback in self.callbacks[event]:
80 try:
81 callback()
82 except Exception as e:
83 self.log.error("KernelRestarter: %s callback %r failed", event, callback, exc_info=True)
84
74 85 def poll(self):
75 86 self.log.debug('Polling kernel...')
76 87 if not self.kernel_manager.is_alive():
77 self.log.info('KernelRestarter: restarting kernel')
78 for callback in self.callbacks['restart']:
79 try:
80 callback()
81 except Exception as e:
82 self.log.error("Kernel restart callback %r failed", callback, exc_info=True)
83 self.kernel_manager.restart_kernel(now=True)
88 if self._restarting:
89 self.log.warn("KernelRestarter: restart failed")
90 self._fire_callbacks('dead')
91 self._restarting = False
92 else:
93 self.log.info('KernelRestarter: restarting kernel')
94 self._fire_callbacks('restart')
95 self.kernel_manager.restart_kernel(now=True)
96 self._restarting = True
General Comments 0
You need to be logged in to leave comments. Login now