@@ -129,7 +129,12 @@ def create_stream(self):
129129 stream .channel = channel
130130
131131 def nudge (self ):
132- shell_channel = self .channels ['shell' ]
132+ # Use a transient shell channel to prevent leaking
133+ # shell responses to the front-end.
134+ kernel = self .kernel_manager .get_kernel (self .kernel_id )
135+ shell_channel = kernel .connect_shell ()
136+
137+ # The IOPub used by the client.
133138 iopub_channel = self .channels ['iopub' ]
134139
135140 future = Future ()
@@ -141,18 +146,20 @@ def finish():
141146 loop .remove_timeout (timeout )
142147 loop .remove_timeout (nudge_handle )
143148 iopub_channel .stop_on_recv ()
144- shell_channel .stop_on_recv ()
149+ if not shell_channel .closed ():
150+ shell_channel .close ()
145151
146152 def on_shell_reply (msg ):
147153 if not info_future .done ():
148154 self .log .debug ("Nudge: shell info reply received: %s" , self .kernel_id )
149- shell_channel .stop_on_recv ()
155+ if not shell_channel .closed ():
156+ shell_channel .close ()
150157 self .log .debug ("Nudge: resolving shell future" )
151- info_future .set_result (msg )
158+ info_future .set_result (None )
152159 if iopub_future .done ():
153160 finish ()
154161 self .log .debug ("Nudge: resolving main future in shell handler" )
155- future .set_result (info_future . result () )
162+ future .set_result (None )
156163
157164 def on_iopub (msg ):
158165 if not iopub_future .done ():
@@ -163,7 +170,7 @@ def on_iopub(msg):
163170 if info_future .done ():
164171 finish ()
165172 self .log .debug ("Nudge: resolving main future in iopub handler" )
166- future .set_result (info_future . result () )
173+ future .set_result (None )
167174
168175 def on_timeout ():
169176 self .log .warning ("Nudge: Timeout waiting for kernel_info_reply: %s" , self .kernel_id )
@@ -177,16 +184,18 @@ def on_timeout():
177184
178185 # Nudge the kernel with kernel info requests until we get an IOPub message
179186 def nudge (count ):
180- count += 1
181- nonlocal nudge_handle
187+ # Do not nudge busy kernels as kernel info requests sent to shell are
188+ # queued behind execution requests.
189+ if kernel .execution_state == 'busy' :
190+ future .set_result (None )
182191 if not future .done ():
183192 log = self .log .warning if count % 10 == 0 else self .log .debug
184193 log ("Nudging attempt %s on kernel %s" % (count , self .kernel_id ))
185194 self .session .send (shell_channel , "kernel_info_request" )
195+ nonlocal nudge_handle
186196 nudge_handle = loop .call_later (0.5 , nudge , count )
187197
188198 nudge_handle = loop .call_later (0 , nudge , count = 0 )
189-
190199 timeout = loop .add_timeout (loop .time () + self .kernel_info_timeout , on_timeout )
191200 return future
192201
0 commit comments