| 227 | return self.kernel_task is not None and self.kernel_task.is_alive() |
| 228 | |
| 229 | def interrupt_kernel(self) -> None: |
| 230 | if self.kernel_task is None: |
| 231 | return |
| 232 | |
| 233 | if isinstance(self.kernel_task, threading.Thread): |
| 234 | # no interruptions in run mode |
| 235 | return |
| 236 | |
| 237 | if self.kernel_task.pid is not None: |
| 238 | q = self.queue_manager.win32_interrupt_queue |
| 239 | if sys.platform == "win32" and q is not None: |
| 240 | LOGGER.debug("Queueing interrupt request for kernel.") |
| 241 | q.put_nowait(True) |
| 242 | else: |
| 243 | LOGGER.debug("Sending SIGINT to kernel") |
| 244 | os.kill(self.kernel_task.pid, signal.SIGINT) |
| 245 | |
| 246 | def close_kernel(self) -> None: |
| 247 | assert self.kernel_task is not None, "kernel not started" |