Show More
@@ -96,41 +96,25 b' class MultiKernelManager(LoggingConfigurable):' | |||||
96 | self._kernels[kernel_id] = km |
|
96 | self._kernels[kernel_id] = km | |
97 | return kernel_id |
|
97 | return kernel_id | |
98 |
|
98 | |||
99 | def shutdown_kernel(self, kernel_id): |
|
99 | def shutdown_kernel(self, kernel_id, now=False): | |
100 | """Shutdown a kernel by its kernel uuid. |
|
100 | """Shutdown a kernel by its kernel uuid. | |
101 |
|
101 | |||
102 | Parameters |
|
102 | Parameters | |
103 | ========== |
|
103 | ========== | |
104 | kernel_id : uuid |
|
104 | kernel_id : uuid | |
105 | The id of the kernel to shutdown. |
|
105 | The id of the kernel to shutdown. | |
|
106 | now : bool | |||
|
107 | Should the kernel be shutdown forcibly using a signal. | |||
106 | """ |
|
108 | """ | |
107 | k = self.get_kernel(kernel_id) |
|
109 | k = self.get_kernel(kernel_id) | |
108 | k.shutdown_kernel() |
|
110 | k.shutdown_kernel(now=now) | |
109 | k.shell_channel.stop() |
|
111 | k.shell_channel.stop() | |
110 | del self._kernels[kernel_id] |
|
112 | del self._kernels[kernel_id] | |
111 |
|
113 | |||
112 | def shutdown_all(self): |
|
114 | def shutdown_all(self, now=False): | |
113 | """Shutdown all kernels.""" |
|
115 | """Shutdown all kernels.""" | |
114 | for kid in self.list_kernel_ids(): |
|
116 | for kid in self.list_kernel_ids(): | |
115 | self.shutdown_kernel(kid) |
|
117 | self.shutdown_kernel(kid, now=now) | |
116 |
|
||||
117 | def kill_kernel(self, kernel_id): |
|
|||
118 | """Kill a kernel by its kernel uuid. |
|
|||
119 |
|
||||
120 | Parameters |
|
|||
121 | ========== |
|
|||
122 | kernel_id : uuid |
|
|||
123 | The id of the kernel to kill. |
|
|||
124 | """ |
|
|||
125 | k = self.get_kernel(kernel_id) |
|
|||
126 | k.kill_kernel() |
|
|||
127 | k.shell_channel.stop() |
|
|||
128 | del self._kernels[kernel_id] |
|
|||
129 |
|
||||
130 | def kill_all(self): |
|
|||
131 | """Kill all kernels.""" |
|
|||
132 | for kid in self.list_kernel_ids(): |
|
|||
133 | self.kill_kernel(kid) |
|
|||
134 |
|
118 | |||
135 | def interrupt_kernel(self, kernel_id): |
|
119 | def interrupt_kernel(self, kernel_id): | |
136 | """Interrupt (SIGINT) the kernel by its uuid. |
|
120 | """Interrupt (SIGINT) the kernel by its uuid. | |
@@ -143,7 +127,7 b' class MultiKernelManager(LoggingConfigurable):' | |||||
143 | return self.get_kernel(kernel_id).interrupt_kernel() |
|
127 | return self.get_kernel(kernel_id).interrupt_kernel() | |
144 |
|
128 | |||
145 | def signal_kernel(self, kernel_id, signum): |
|
129 | def signal_kernel(self, kernel_id, signum): | |
146 |
""" |
|
130 | """Sends a signal to the kernel by its uuid. | |
147 |
|
131 | |||
148 | Note that since only SIGTERM is supported on Windows, this function |
|
132 | Note that since only SIGTERM is supported on Windows, this function | |
149 | is only useful on Unix systems. |
|
133 | is only useful on Unix systems. | |
@@ -330,20 +314,15 b' class MappingKernelManager(MultiKernelManager):' | |||||
330 | self.log.info("Using existing kernel: %s" % kernel_id) |
|
314 | self.log.info("Using existing kernel: %s" % kernel_id) | |
331 | return kernel_id |
|
315 | return kernel_id | |
332 |
|
316 | |||
333 | def shutdown_kernel(self, kernel_id): |
|
317 | def shutdown_kernel(self, kernel_id, now=False): | |
334 | """Shutdown a kernel and remove its notebook association.""" |
|
318 | """Shutdown a kernel and remove its notebook association.""" | |
335 | self._check_kernel_id(kernel_id) |
|
319 | self._check_kernel_id(kernel_id) | |
336 |
super(MappingKernelManager, self).shutdown_kernel( |
|
320 | super(MappingKernelManager, self).shutdown_kernel( | |
|
321 | kernel_id, now=now | |||
|
322 | ) | |||
337 | self.delete_mapping_for_kernel(kernel_id) |
|
323 | self.delete_mapping_for_kernel(kernel_id) | |
338 | self.log.info("Kernel shutdown: %s" % kernel_id) |
|
324 | self.log.info("Kernel shutdown: %s" % kernel_id) | |
339 |
|
325 | |||
340 | def kill_kernel(self, kernel_id): |
|
|||
341 | """Kill a kernel and remove its notebook association.""" |
|
|||
342 | self._check_kernel_id(kernel_id) |
|
|||
343 | super(MappingKernelManager, self).kill_kernel(kernel_id) |
|
|||
344 | self.delete_mapping_for_kernel(kernel_id) |
|
|||
345 | self.log.info("Kernel killed: %s" % kernel_id) |
|
|||
346 |
|
||||
347 | def interrupt_kernel(self, kernel_id): |
|
326 | def interrupt_kernel(self, kernel_id): | |
348 | """Interrupt a kernel.""" |
|
327 | """Interrupt a kernel.""" | |
349 | self._check_kernel_id(kernel_id) |
|
328 | self._check_kernel_id(kernel_id) |
@@ -277,7 +277,7 b' class InProcessKernelManager(Configurable):' | |||||
277 | self.kernel.frontends.append(self) |
|
277 | self.kernel.frontends.append(self) | |
278 |
|
278 | |||
279 | def shutdown_kernel(self): |
|
279 | def shutdown_kernel(self): | |
280 | self.kill_kernel() |
|
280 | self._kill_kernel() | |
281 |
|
281 | |||
282 | def restart_kernel(self, now=False, **kwds): |
|
282 | def restart_kernel(self, now=False, **kwds): | |
283 | self.shutdown_kernel() |
|
283 | self.shutdown_kernel() | |
@@ -287,7 +287,7 b' class InProcessKernelManager(Configurable):' | |||||
287 | def has_kernel(self): |
|
287 | def has_kernel(self): | |
288 | return self.kernel is not None |
|
288 | return self.kernel is not None | |
289 |
|
289 | |||
290 | def kill_kernel(self): |
|
290 | def _kill_kernel(self): | |
291 | self.kernel.frontends.remove(self) |
|
291 | self.kernel.frontends.remove(self) | |
292 | self.kernel = None |
|
292 | self.kernel = None | |
293 |
|
293 |
@@ -923,7 +923,7 b' class KernelManager(Configurable):' | |||||
923 | """ |
|
923 | """ | |
924 | # FIXME: Shutdown does not work on Windows due to ZMQ errors! |
|
924 | # FIXME: Shutdown does not work on Windows due to ZMQ errors! | |
925 | if sys.platform == 'win32': |
|
925 | if sys.platform == 'win32': | |
926 | self.kill_kernel() |
|
926 | self._kill_kernel() | |
927 | return |
|
927 | return | |
928 |
|
928 | |||
929 | # Pause the heart beat channel if it exists. |
|
929 | # Pause the heart beat channel if it exists. | |
@@ -932,7 +932,7 b' class KernelManager(Configurable):' | |||||
932 |
|
932 | |||
933 | if now: |
|
933 | if now: | |
934 | if self.has_kernel: |
|
934 | if self.has_kernel: | |
935 | self.kill_kernel() |
|
935 | self._kill_kernel() | |
936 | else: |
|
936 | else: | |
937 | # Don't send any additional kernel kill messages immediately, to give |
|
937 | # Don't send any additional kernel kill messages immediately, to give | |
938 | # the kernel a chance to properly execute shutdown actions. Wait for at |
|
938 | # the kernel a chance to properly execute shutdown actions. Wait for at | |
@@ -946,7 +946,7 b' class KernelManager(Configurable):' | |||||
946 | else: |
|
946 | else: | |
947 | # OK, we've waited long enough. |
|
947 | # OK, we've waited long enough. | |
948 | if self.has_kernel: |
|
948 | if self.has_kernel: | |
949 | self.kill_kernel() |
|
949 | self._kill_kernel() | |
950 |
|
950 | |||
951 | if not restart: |
|
951 | if not restart: | |
952 | self.cleanup_connection_file() |
|
952 | self.cleanup_connection_file() | |
@@ -994,7 +994,7 b' class KernelManager(Configurable):' | |||||
994 | """Has a kernel been started that we are managing.""" |
|
994 | """Has a kernel been started that we are managing.""" | |
995 | return self.kernel is not None |
|
995 | return self.kernel is not None | |
996 |
|
996 | |||
997 | def kill_kernel(self): |
|
997 | def _kill_kernel(self): | |
998 | """Kill the running kernel. |
|
998 | """Kill the running kernel. | |
999 |
|
999 | |||
1000 | This is a private method, callers should use shutdown_kernel(now=True). |
|
1000 | This is a private method, callers should use shutdown_kernel(now=True). |
General Comments 0
You need to be logged in to leave comments.
Login now