##// END OF EJS Templates
expose restart callbacks via KernelManager
MinRK -
Show More
@@ -111,6 +111,18 b' class KernelManager(LoggingConfigurable, ConnectionFileMixin):'
111 def stop_restarter(self):
111 def stop_restarter(self):
112 pass
112 pass
113
113
114 def add_restart_callback(self, callback, event='restart'):
115 """register a callback to be called when a kernel is restarted"""
116 if self._restarter is None:
117 return
118 self._restarter.add_callback(callback, event)
119
120 def remove_restart_callback(self, callback, event='restart'):
121 """unregister a callback to be called when a kernel is restarted"""
122 if self._restarter is None:
123 return
124 self._restarter.remove_callback(callback, event)
125
114 #--------------------------------------------------------------------------
126 #--------------------------------------------------------------------------
115 # create a Client connected to our Kernel
127 # create a Client connected to our Kernel
116 #--------------------------------------------------------------------------
128 #--------------------------------------------------------------------------
@@ -201,6 +201,14 b' class MultiKernelManager(LoggingConfigurable):'
201 return self._kernels[kernel_id]
201 return self._kernels[kernel_id]
202
202
203 @kernel_method
203 @kernel_method
204 def add_restart_callback(self, kernel_id, callback, event='restart'):
205 """add a callback for the KernelRestarter"""
206
207 @kernel_method
208 def remove_restart_callback(self, kernel_id, callback, event='restart'):
209 """remove a callback for the KernelRestarter"""
210
211 @kernel_method
204 def get_connection_info(self, kernel_id):
212 def get_connection_info(self, kernel_id):
205 """Return a dictionary of connection data for a kernel.
213 """Return a dictionary of connection data for a kernel.
206
214
@@ -17,10 +17,9 b' It is an incomplete base class, and must be subclassed.'
17 # Imports
17 # Imports
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19
19
20
21 from IPython.config.configurable import LoggingConfigurable
20 from IPython.config.configurable import LoggingConfigurable
22 from IPython.utils.traitlets import (
21 from IPython.utils.traitlets import (
23 Instance, Float, List,
22 Instance, Float, Dict,
24 )
23 )
25
24
26 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
@@ -35,7 +34,9 b' class KernelRestarter(LoggingConfigurable):'
35 time_to_dead = Float(3.0, config=True,
34 time_to_dead = Float(3.0, config=True,
36 help="""Kernel heartbeat interval in seconds."""
35 help="""Kernel heartbeat interval in seconds."""
37 )
36 )
38 _callbacks = List()
37 callbacks = Dict()
38 def _callbacks_default(self):
39 return dict(restart=[], dead=[])
39
40
40 def start(self):
41 def start(self):
41 """Start the polling of the kernel."""
42 """Start the polling of the kernel."""
@@ -45,13 +46,28 b' class KernelRestarter(LoggingConfigurable):'
45 """Stop the kernel polling."""
46 """Stop the kernel polling."""
46 raise NotImplementedError("Must be implemented in a subclass")
47 raise NotImplementedError("Must be implemented in a subclass")
47
48
48 def register_callback(self, f):
49 def add_callback(self, f, event='restart'):
49 """register a callback to fire"""
50 """register a callback to fire on a particular event
50 self._callbacks.append(f)
51
52 Possible values for event:
53
54 'restart' (default): kernel has died, and will be restarted.
55 'dead': restart has failed, kernel will be left dead.
56
57 """
58 self.callbacks[event].append(f)
59
60 def remove_callback(self, f, event='restart'):
61 """unregister a callback to fire on a particular event
62
63 Possible values for event:
64
65 'restart' (default): kernel has died, and will be restarted.
66 'dead': restart has failed, kernel will be left dead.
51
67
52 def unregister_callback(self, f):
68 """
53 try:
69 try:
54 self._callbacks.remove(f)
70 self.callbacks[event].remove(f)
55 except ValueError:
71 except ValueError:
56 pass
72 pass
57
73
@@ -59,7 +75,7 b' class KernelRestarter(LoggingConfigurable):'
59 self.log.debug('Polling kernel...')
75 self.log.debug('Polling kernel...')
60 if not self.kernel_manager.is_alive():
76 if not self.kernel_manager.is_alive():
61 self.log.info('KernelRestarter: restarting kernel')
77 self.log.info('KernelRestarter: restarting kernel')
62 for callback in self._callbacks:
78 for callback in self.callbacks['restart']:
63 try:
79 try:
64 callback()
80 callback()
65 except Exception as e:
81 except Exception as e:
General Comments 0
You need to be logged in to leave comments. Login now