Show More
@@ -0,0 +1,62 b'' | |||||
|
1 | """A basic in process kernel monitor with autorestarting. | |||
|
2 | ||||
|
3 | This watches a kernel's state using KernelManager.is_alive and auto | |||
|
4 | restarts the kernel if it dies. | |||
|
5 | """ | |||
|
6 | ||||
|
7 | #----------------------------------------------------------------------------- | |||
|
8 | # Copyright (C) 2013 The IPython Development Team | |||
|
9 | # | |||
|
10 | # Distributed under the terms of the BSD License. The full license is in | |||
|
11 | # the file COPYING, distributed as part of this software. | |||
|
12 | #----------------------------------------------------------------------------- | |||
|
13 | ||||
|
14 | #----------------------------------------------------------------------------- | |||
|
15 | # Imports | |||
|
16 | #----------------------------------------------------------------------------- | |||
|
17 | ||||
|
18 | import zmq | |||
|
19 | from zmq.eventloop import ioloop | |||
|
20 | ||||
|
21 | ||||
|
22 | from IPython.config.configurable import LoggingConfigurable | |||
|
23 | from IPython.utils.traitlets import ( | |||
|
24 | Instance, Float | |||
|
25 | ) | |||
|
26 | ||||
|
27 | #----------------------------------------------------------------------------- | |||
|
28 | # Code | |||
|
29 | #----------------------------------------------------------------------------- | |||
|
30 | ||||
|
31 | class KernelRestarter(LoggingConfigurable): | |||
|
32 | """Monitor and autorestart a kernel.""" | |||
|
33 | ||||
|
34 | loop = Instance('zmq.eventloop.ioloop.IOLoop', allow_none=False) | |||
|
35 | def _loop_default(self): | |||
|
36 | return ioloop.IOLoop.instance() | |||
|
37 | ||||
|
38 | kernel_manager = Instance('IPython.kernel.kernelmanager.KernelManager') | |||
|
39 | ||||
|
40 | time_to_dead = Float(3.0, config=True, | |||
|
41 | help="""Kernel heartbeat interval in seconds.""" | |||
|
42 | ) | |||
|
43 | ||||
|
44 | def __init__(self, **kwargs): | |||
|
45 | super(KernelRestarter, self).__init__(**kwargs) | |||
|
46 | ||||
|
47 | def start(self): | |||
|
48 | self.pc = ioloop.PeriodicCallback(self.poll, self.time_to_dead, self.ioloop) | |||
|
49 | self.pc.start() | |||
|
50 | ||||
|
51 | def poll(self): | |||
|
52 | if not self.kernel_manager.is_alive(): | |||
|
53 | self.stop() | |||
|
54 | # This restart event should leave the connection file in place so | |||
|
55 | # the ports are the same. Because this takes place below the | |||
|
56 | # MappingKernelManager, the kernel_id will also remain the same. | |||
|
57 | self.kernel_manager.restart_kernel(now=True); | |||
|
58 | self.start() | |||
|
59 | ||||
|
60 | def stop(self): | |||
|
61 | self.pc.stop() | |||
|
62 | self.pc = None |
General Comments 0
You need to be logged in to leave comments.
Login now