##// END OF EJS Templates
Merge pull request #3491 from takluyver/notebook-kernel-died...
Min RK -
r11075:3dc04f8e merge
parent child Browse files
Show More
@@ -1,110 +1,110 b''
1 """A kernel manager relating notebooks and kernels
1 """A kernel manager relating notebooks and kernels
2
2
3 Authors:
3 Authors:
4
4
5 * Brian Granger
5 * Brian Granger
6 """
6 """
7
7
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2013 The IPython Development Team
9 # Copyright (C) 2013 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 from tornado import web
19 from tornado import web
20
20
21 from IPython.kernel.multikernelmanager import MultiKernelManager
21 from IPython.kernel.multikernelmanager import MultiKernelManager
22 from IPython.utils.traitlets import (
22 from IPython.utils.traitlets import (
23 Dict, List, Unicode, Integer,
23 Dict, List, Unicode, Integer,
24 )
24 )
25
25
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27 # Classes
27 # Classes
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29
29
30
30
31 class MappingKernelManager(MultiKernelManager):
31 class MappingKernelManager(MultiKernelManager):
32 """A KernelManager that handles notebook mapping and HTTP error handling"""
32 """A KernelManager that handles notebook mapping and HTTP error handling"""
33
33
34 def _kernel_manager_class_default(self):
34 def _kernel_manager_class_default(self):
35 return "IPython.kernel.ioloop.IOLoopKernelManager"
35 return "IPython.kernel.ioloop.IOLoopKernelManager"
36
36
37 kernel_argv = List(Unicode)
37 kernel_argv = List(Unicode)
38
38
39 _notebook_mapping = Dict()
39 _notebook_mapping = Dict()
40
40
41 #-------------------------------------------------------------------------
41 #-------------------------------------------------------------------------
42 # Methods for managing kernels and sessions
42 # Methods for managing kernels and sessions
43 #-------------------------------------------------------------------------
43 #-------------------------------------------------------------------------
44
44
45 def kernel_for_notebook(self, notebook_id):
45 def kernel_for_notebook(self, notebook_id):
46 """Return the kernel_id for a notebook_id or None."""
46 """Return the kernel_id for a notebook_id or None."""
47 return self._notebook_mapping.get(notebook_id)
47 return self._notebook_mapping.get(notebook_id)
48
48
49 def set_kernel_for_notebook(self, notebook_id, kernel_id):
49 def set_kernel_for_notebook(self, notebook_id, kernel_id):
50 """Associate a notebook with a kernel."""
50 """Associate a notebook with a kernel."""
51 if notebook_id is not None:
51 if notebook_id is not None:
52 self._notebook_mapping[notebook_id] = kernel_id
52 self._notebook_mapping[notebook_id] = kernel_id
53
53
54 def notebook_for_kernel(self, kernel_id):
54 def notebook_for_kernel(self, kernel_id):
55 """Return the notebook_id for a kernel_id or None."""
55 """Return the notebook_id for a kernel_id or None."""
56 for notebook_id, kid in self._notebook_mapping.iteritems():
56 for notebook_id, kid in self._notebook_mapping.iteritems():
57 if kernel_id == kid:
57 if kernel_id == kid:
58 return notebook_id
58 return notebook_id
59 return None
59 return None
60
60
61 def delete_mapping_for_kernel(self, kernel_id):
61 def delete_mapping_for_kernel(self, kernel_id):
62 """Remove the kernel/notebook mapping for kernel_id."""
62 """Remove the kernel/notebook mapping for kernel_id."""
63 notebook_id = self.notebook_for_kernel(kernel_id)
63 notebook_id = self.notebook_for_kernel(kernel_id)
64 if notebook_id is not None:
64 if notebook_id is not None:
65 del self._notebook_mapping[notebook_id]
65 del self._notebook_mapping[notebook_id]
66
66
67 def _handle_kernel_died(self, kernel_id):
67 def _handle_kernel_died(self, kernel_id):
68 """notice that a kernel died"""
68 """notice that a kernel died"""
69 self.log.warn("Kernel %s died, removing from map.", kernel_id)
69 self.log.warn("Kernel %s died, removing from map.", kernel_id)
70 self.delete_mapping_for_kernel(kernel_id)
70 self.delete_mapping_for_kernel(kernel_id)
71 self.remove_kernel(kernel_id, now=True)
71 self.remove_kernel(kernel_id)
72
72
73 def start_kernel(self, notebook_id=None, **kwargs):
73 def start_kernel(self, notebook_id=None, **kwargs):
74 """Start a kernel for a notebook an return its kernel_id.
74 """Start a kernel for a notebook an return its kernel_id.
75
75
76 Parameters
76 Parameters
77 ----------
77 ----------
78 notebook_id : uuid
78 notebook_id : uuid
79 The uuid of the notebook to associate the new kernel with. If this
79 The uuid of the notebook to associate the new kernel with. If this
80 is not None, this kernel will be persistent whenever the notebook
80 is not None, this kernel will be persistent whenever the notebook
81 requests a kernel.
81 requests a kernel.
82 """
82 """
83 kernel_id = self.kernel_for_notebook(notebook_id)
83 kernel_id = self.kernel_for_notebook(notebook_id)
84 if kernel_id is None:
84 if kernel_id is None:
85 kwargs['extra_arguments'] = self.kernel_argv
85 kwargs['extra_arguments'] = self.kernel_argv
86 kernel_id = super(MappingKernelManager, self).start_kernel(**kwargs)
86 kernel_id = super(MappingKernelManager, self).start_kernel(**kwargs)
87 self.set_kernel_for_notebook(notebook_id, kernel_id)
87 self.set_kernel_for_notebook(notebook_id, kernel_id)
88 self.log.info("Kernel started: %s" % kernel_id)
88 self.log.info("Kernel started: %s" % kernel_id)
89 self.log.debug("Kernel args: %r" % kwargs)
89 self.log.debug("Kernel args: %r" % kwargs)
90 # register callback for failed auto-restart
90 # register callback for failed auto-restart
91 self.add_restart_callback(kernel_id,
91 self.add_restart_callback(kernel_id,
92 lambda : self._handle_kernel_died(kernel_id),
92 lambda : self._handle_kernel_died(kernel_id),
93 'dead',
93 'dead',
94 )
94 )
95 else:
95 else:
96 self.log.info("Using existing kernel: %s" % kernel_id)
96 self.log.info("Using existing kernel: %s" % kernel_id)
97
97
98 return kernel_id
98 return kernel_id
99
99
100 def shutdown_kernel(self, kernel_id, now=False):
100 def shutdown_kernel(self, kernel_id, now=False):
101 """Shutdown a kernel by kernel_id"""
101 """Shutdown a kernel by kernel_id"""
102 super(MappingKernelManager, self).shutdown_kernel(kernel_id, now=now)
102 super(MappingKernelManager, self).shutdown_kernel(kernel_id, now=now)
103 self.delete_mapping_for_kernel(kernel_id)
103 self.delete_mapping_for_kernel(kernel_id)
104
104
105 # override _check_kernel_id to raise 404 instead of KeyError
105 # override _check_kernel_id to raise 404 instead of KeyError
106 def _check_kernel_id(self, kernel_id):
106 def _check_kernel_id(self, kernel_id):
107 """Check a that a kernel_id exists and raise 404 if not."""
107 """Check a that a kernel_id exists and raise 404 if not."""
108 if kernel_id not in self:
108 if kernel_id not in self:
109 raise web.HTTPError(404, u'Kernel does not exist: %s' % kernel_id)
109 raise web.HTTPError(404, u'Kernel does not exist: %s' % kernel_id)
110
110
General Comments 0
You need to be logged in to leave comments. Login now