1
1
import asyncio
2
2
import json
3
+ import time
3
4
import weakref
4
5
from concurrent .futures import Future
5
6
from textwrap import dedent
16
17
except ImportError :
17
18
from jupyter_client .jsonutil import date_default as json_default
18
19
20
+ from jupyter_client .utils import ensure_async
21
+
19
22
from jupyter_server .transutils import _i18n
20
23
21
24
from .abc import KernelWebsocketConnectionABC
@@ -282,7 +285,7 @@ async def _register_session(self):
282
285
if (
283
286
self .kernel_id in self .multi_kernel_manager
284
287
): # only update open sessions if kernel is actively managed
285
- self ._open_sessions [self .session_key ] = self
288
+ self ._open_sessions [self .session_key ] = self . websocket_handler
286
289
287
290
async def prepare (self ):
288
291
# check session collision:
@@ -302,6 +305,12 @@ async def prepare(self):
302
305
self .kernel_manager .reason = str (e )
303
306
raise web .HTTPError (500 , str (e )) from e
304
307
308
+ t0 = time .time ()
309
+ while not await ensure_async (self .kernel_manager .is_alive ()):
310
+ await asyncio .sleep (0.1 )
311
+ if time .time () - t0 > self .multi_kernel_manager .kernel_info_timeout :
312
+ raise TimeoutError ("Kernel never reached an 'alive' state." )
313
+
305
314
self .session .key = self .kernel_manager .session .key
306
315
future = self .request_kernel_info ()
307
316
@@ -360,7 +369,7 @@ def replay(value):
360
369
for _ , stream in self .channels .items ():
361
370
if not stream .closed ():
362
371
stream .close ()
363
- self .close ()
372
+ self .disconnect ()
364
373
return
365
374
366
375
self .multi_kernel_manager .add_restart_callback (self .kernel_id , self .on_kernel_restarted )
@@ -376,6 +385,9 @@ def subscribe(value):
376
385
ZMQChannelsWebsocketConnection ._open_sockets .add (self )
377
386
return connected
378
387
388
+ def close (self ):
389
+ return self .disconnect ()
390
+
379
391
def disconnect (self ):
380
392
self .log .debug ("Websocket closed %s" , self .session_key )
381
393
# unregister myself as an open session (only if it's really me)
@@ -536,7 +548,7 @@ def _on_zmq_reply(self, stream, msg_list):
536
548
# eventloop but hasn't been called.
537
549
if stream .closed ():
538
550
self .log .warning ("zmq message arrived on closed channel" )
539
- self .close ()
551
+ self .disconnect ()
540
552
return
541
553
channel = getattr (stream , "channel" , None )
542
554
if self .subprotocol == "v1.kernel.websocket.jupyter.org" :
0 commit comments