2
2
3
3
import logging
4
4
import threading
5
+ import uuid
6
+
5
7
import requests
6
8
7
9
from concurrent .futures import Future
@@ -91,16 +93,16 @@ def exec_cell(
91
93
ws = ws_future .result (timeout = timeout )
92
94
else :
93
95
logger .debug (f"Creating new websocket connection to kernel { kernel_id } " )
94
- ws = self ._connect_to_kernel_ws (kernel_id , timeout = timeout )
96
+ ws = self ._connect_to_kernel_ws (kernel_id , None , timeout = timeout )
95
97
96
- session_id = ws .send_execution_message (code , on_stdout , on_stderr , on_result )
98
+ message_id = ws .send_execution_message (code , on_stdout , on_stderr , on_result )
97
99
logger .debug (
98
- f"Sent execution message to kernel { kernel_id } , session_id : { session_id } "
100
+ f"Sent execution message to kernel { kernel_id } , message_id : { message_id } "
99
101
)
100
102
101
- result = ws .get_result (session_id , timeout = timeout )
103
+ result = ws .get_result (message_id , timeout = timeout )
102
104
logger .debug (
103
- f"Received result from kernel { kernel_id } , session_id : { session_id } , result: { result } "
105
+ f"Received result from kernel { kernel_id } , message_id : { message_id } , result: { result } "
104
106
)
105
107
106
108
return result
@@ -139,24 +141,26 @@ def create_kernel(
139
141
:param timeout: Timeout for the kernel creation request.
140
142
:return: Kernel id of the created kernel
141
143
"""
142
- data = {"path" : cwd }
144
+ data = {"path" : cwd , "kernel" : { "name" : "python3" }, "type" : "notebook" , "name" : str ( uuid . uuid4 ()) }
143
145
if kernel_name :
144
- data ["kernel_name" ] = kernel_name
146
+ data ["kernel" ][ 'name' ] = kernel_name
145
147
logger .debug (f"Creating kernel with data: { data } " )
146
148
147
149
response = requests .post (
148
- f"{ self ._sandbox .get_protocol ()} ://{ self ._sandbox .get_hostname (8888 )} /api/kernels " ,
150
+ f"{ self ._sandbox .get_protocol ()} ://{ self ._sandbox .get_hostname (8888 )} /api/sessions " ,
149
151
json = data ,
150
152
timeout = timeout ,
151
153
)
152
154
if not response .ok :
153
155
raise KernelException (f"Failed to create kernel: { response .text } " )
154
156
155
- kernel_id = response .json ()["id" ]
157
+ session_data = response .json ()
158
+ kernel_id = session_data ["kernel" ]["id" ]
159
+ session_id = session_data ["id" ]
156
160
logger .debug (f"Created kernel { kernel_id } " )
157
161
158
162
threading .Thread (
159
- target = self ._connect_to_kernel_ws , args = (kernel_id , timeout )
163
+ target = self ._connect_to_kernel_ws , args = (kernel_id , session_id , timeout )
160
164
).start ()
161
165
return kernel_id
162
166
@@ -186,7 +190,7 @@ def restart_kernel(
186
190
logger .debug (f"Restarted kernel { kernel_id } " )
187
191
188
192
threading .Thread (
189
- target = self ._connect_to_kernel_ws , args = (kernel_id , timeout )
193
+ target = self ._connect_to_kernel_ws , args = (kernel_id , None , timeout )
190
194
).start ()
191
195
192
196
def shutdown_kernel (
@@ -243,7 +247,7 @@ def close(self):
243
247
ws .result ().close ()
244
248
245
249
def _connect_to_kernel_ws (
246
- self , kernel_id : str , timeout : Optional [float ] = TIMEOUT
250
+ self , kernel_id : str , session_id : Optional [ str ], timeout : Optional [float ] = TIMEOUT
247
251
) -> JupyterKernelWebSocket :
248
252
"""
249
253
Establishes a WebSocket connection to a specified Jupyter kernel.
@@ -257,9 +261,12 @@ def _connect_to_kernel_ws(
257
261
future = Future ()
258
262
self ._connected_kernels [kernel_id ] = future
259
263
264
+ session_id = session_id or str (uuid .uuid4 ())
260
265
ws = JupyterKernelWebSocket (
261
266
url = f"{ self ._sandbox .get_protocol ('ws' )} ://{ self ._sandbox .get_hostname (8888 )} /api/kernels/{ kernel_id } /channels" ,
267
+ session_id = session_id
262
268
)
269
+
263
270
ws .connect (timeout = timeout )
264
271
logger .debug (f"Connected to kernel's ({ kernel_id } ) websocket." )
265
272
@@ -279,12 +286,14 @@ def setup_default_kernel():
279
286
kernel_id = self ._sandbox .filesystem .read (
280
287
"/root/.jupyter/kernel_id" , timeout = timeout
281
288
)
289
+
282
290
if kernel_id is None and not self ._sandbox .is_open :
283
291
return
284
292
285
293
kernel_id = kernel_id .strip ()
294
+
286
295
logger .debug (f"Default kernel id: { kernel_id } " )
287
- self ._connect_to_kernel_ws (kernel_id , timeout = timeout )
296
+ self ._connect_to_kernel_ws (kernel_id , None , timeout = timeout )
288
297
self ._kernel_id_set .set_result (kernel_id )
289
298
290
299
threading .Thread (target = setup_default_kernel ).start ()
0 commit comments