Skip to content

Commit e72bf71

Browse files
Support external kernels (#1305)
1 parent b1388b5 commit e72bf71

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

jupyter_server/serverapp.py

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import urllib
2525
import warnings
2626
from base64 import encodebytes
27+
from pathlib import Path
2728

29+
import jupyter_client
2830
from jupyter_client.kernelspec import KernelSpecManager
2931
from jupyter_client.manager import KernelManager
3032
from jupyter_client.session import Session
@@ -1638,6 +1640,26 @@ def _update_notebook_dir(self, change):
16381640
self.log.warning(_i18n("notebook_dir is deprecated, use root_dir"))
16391641
self.root_dir = change["new"]
16401642

1643+
external_connection_dir = Unicode(
1644+
None,
1645+
allow_none=True,
1646+
config=True,
1647+
help=_i18n(
1648+
"The directory to look at for external kernel connection files, if allow_external_kernels is True. "
1649+
"Defaults to Jupyter runtime_dir/external_kernels. "
1650+
"Make sure that this directory is not filled with left-over connection files, "
1651+
"that could result in unnecessary kernel manager creations."
1652+
),
1653+
)
1654+
1655+
allow_external_kernels = Bool(
1656+
False,
1657+
config=True,
1658+
help=_i18n(
1659+
"Whether or not to allow external kernels, whose connection files are placed in external_connection_dir."
1660+
),
1661+
)
1662+
16411663
root_dir = Unicode(config=True, help=_i18n("The directory to use for notebooks and kernels."))
16421664
_root_dir_set = False
16431665

@@ -1873,12 +1895,26 @@ def init_configurables(self):
18731895
self.kernel_spec_manager = self.kernel_spec_manager_class(
18741896
parent=self,
18751897
)
1876-
self.kernel_manager = self.kernel_manager_class(
1877-
parent=self,
1878-
log=self.log,
1879-
connection_dir=self.runtime_dir,
1880-
kernel_spec_manager=self.kernel_spec_manager,
1881-
)
1898+
1899+
kwargs = {
1900+
"parent": self,
1901+
"log": self.log,
1902+
"connection_dir": self.runtime_dir,
1903+
"kernel_spec_manager": self.kernel_spec_manager,
1904+
}
1905+
if jupyter_client.version_info > (8, 3, 0):
1906+
if self.allow_external_kernels:
1907+
external_connection_dir = self.external_connection_dir
1908+
if external_connection_dir is None:
1909+
external_connection_dir = str(Path(self.runtime_dir) / "external_kernels")
1910+
kwargs["external_connection_dir"] = external_connection_dir
1911+
elif self.allow_external_kernels:
1912+
self.log.warning(
1913+
"Although allow_external_kernels=True, external kernels are not supported "
1914+
"because jupyter-client's version does not allow them (should be >8.3.0)."
1915+
)
1916+
1917+
self.kernel_manager = self.kernel_manager_class(**kwargs)
18821918
self.contents_manager = self.contents_manager_class(
18831919
parent=self,
18841920
log=self.log,

jupyter_server/services/kernels/connection/channels.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,10 @@ def disconnect(self):
410410
)
411411

412412
# start buffering instead of closing if this was the last connection
413-
if self.multi_kernel_manager._kernel_connections[self.kernel_id] == 0:
413+
if (
414+
self.kernel_id in self.multi_kernel_manager._kernel_connections
415+
and self.multi_kernel_manager._kernel_connections[self.kernel_id] == 0
416+
):
414417
self.multi_kernel_manager.start_buffering(
415418
self.kernel_id, self.session_key, self.channels
416419
)

0 commit comments

Comments
 (0)