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, |
|
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 |
|
|
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 |
|
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. |
|
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. |
|
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