Skip to content

Commit 3fa2096

Browse files
committed
fixed disposing jupyter code (ECONRESET)
1 parent f349166 commit 3fa2096

File tree

3 files changed

+63
-22
lines changed

3 files changed

+63
-22
lines changed

pythonFiles/PythonTools/ipythonServer.py

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,30 @@ def _postStartKernel(self, kernelUUID):
412412
self.kernelMonitor = iPythonKernelResponseMonitor(
413413
kernelUUID, self.conn, self.send_lock, shell, iopub)
414414

415+
def stopKernel(self, kernelUUID):
416+
"""Shutdown a kernel by UUID"""
417+
try:
418+
if self.kernelMonitor is not None:
419+
self.kernelMonitor.stop()
420+
finally:
421+
pass
422+
423+
try:
424+
kernel_manager = multiKernelManager.get_kernel(kernelUUID)
425+
kernel_client = kernel_manager.client()
426+
kernel_client.stop_channels()
427+
finally:
428+
pass
429+
430+
try:
431+
kernel_manager = multiKernelManager.get_kernel(kernelUUID)
432+
kernel_manager.shutdown_kernel()
433+
except:
434+
pass
435+
finally:
436+
self.shell_channel = None
437+
self.kernelMonitor = None
438+
415439
def _cmd_stpk(self, id):
416440
"""Shutdown a kernel by UUID"""
417441
while True:
@@ -421,6 +445,21 @@ def _cmd_stpk(self, id):
421445
except socket.timeout:
422446
pass
423447

448+
self.stopKernel(kernelUUID)
449+
450+
with self.send_lock:
451+
write_bytes(self.conn, iPythonSocketServer._STPK)
452+
write_string(self.conn, id)
453+
454+
def _cmd_kill(self, id):
455+
"""Shutdown a kernel by UUID"""
456+
while True:
457+
try:
458+
kernelUUID = read_string(self.conn)
459+
break
460+
except socket.timeout:
461+
pass
462+
424463
try:
425464
if self.kernelMonitor is not None:
426465
self.kernelMonitor.stop()
@@ -439,13 +478,7 @@ def _cmd_stpk(self, id):
439478
kernel_manager.shutdown_kernel()
440479
except:
441480
pass
442-
finally:
443-
self.shell_channel = None
444-
self.kernelMonitor = None
445-
with self.send_lock:
446-
write_bytes(self.conn, iPythonSocketServer._STPK)
447-
write_string(self.conn, id)
448-
481+
449482
def _cmd_rstk(self, id):
450483
"""Restart a kernel by UUID"""
451484
while True:
@@ -562,7 +595,6 @@ def interrupt_main(self):
562595

563596
def exit_process(self):
564597
"""exits the REPL process"""
565-
# TODO: Probably should cleanly shutdown the kernels
566598
sys.exit(0)
567599

568600
def flush(self):
@@ -580,6 +612,7 @@ def flush(self):
580612
to_bytes('stpk'): _cmd_stpk,
581613
to_bytes('rstk'): _cmd_rstk,
582614
to_bytes('itpk'): _cmd_itpk,
615+
to_bytes('kill'): _cmd_kill,
583616
}
584617

585618
_COMMANDS_WITH_IDS = {
@@ -650,7 +683,17 @@ def watch(self):
650683
sys.__stdout__.flush()
651684
while True:
652685
try:
653-
self._process_request(self._input.readline())
686+
kernelUUID = self._input.readline()
687+
sys.__stdout__.write('about to die\n')
688+
sys.__stdout__.flush()
689+
if (len(kernelUUID) > 0):
690+
try:
691+
server.stopKernel(kernelUUID)
692+
except:
693+
pass
694+
server.exit_requested = True
695+
sys.__stdout__.write('adios\n')
696+
sys.__stdout__.flush()
654697
except Exception:
655698
sys.stderr.write(traceback.format_exc() + '\n')
656699
sys.stderr.flush()

src/client/jupyter/jupyter_client/jupyterSocketClient.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ export class JupyterSocketClient extends SocketCallbackHandler {
3232
private guid: string;
3333

3434
public dispose() {
35-
try {
36-
this.SendRawCommand(Commands.ExitCommandBytes);
37-
}
38-
catch (ex) {
39-
}
4035
super.dispose();
4136
}
4237
protected handleHandshake(): boolean {

src/client/jupyter/jupyter_client/main.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ export class JupyterClientAdapter extends EventEmitter implements IJupyterClient
2727

2828
public dispose() {
2929
try {
30-
this.ipythonAdapter.sendKernelCommand(this.lastStartedKernelUUID, KernelCommand.shutdown).catch(()=>{});
30+
if (this.process){
31+
this.process.stdin.write(this.lastStartedKernelUUID ? this.lastStartedKernelUUID : '');
32+
this.process.stdin.write('\n');
33+
}
3134
}
3235
catch (ex) {
3336
}
@@ -36,11 +39,6 @@ export class JupyterClientAdapter extends EventEmitter implements IJupyterClient
3639
}
3740
catch (ex) {
3841
}
39-
try {
40-
this.process.kill();
41-
}
42-
catch (ex) {
43-
}
4442
try {
4543
this.socketServer.Stop();
4644
}
@@ -77,15 +75,15 @@ export class JupyterClientAdapter extends EventEmitter implements IJupyterClient
7775
const promiseToResolve = isInTestRun ? testDef.resolve.bind(testDef) : def.resolve.bind(def);
7876

7977
this.process.stdout.on('data', (data: string) => {
80-
if (data.split(/\r?\n/g).some(line => line === 'Started')) {
78+
if (!processStarted && data.split(/\r?\n/g).some(line => line === 'Started')) {
8179
processStarted = true;
8280
if (processStarted && handshakeDone) {
8381
promiseToResolve();
8482
}
8583
return;
8684
}
8785
this.outputChannel.append(data);
88-
});
86+
});
8987
this.process.stderr.on('data', (data: string) => {
9088
this.outputChannel.append(data);
9189
});
@@ -129,6 +127,11 @@ export class JupyterClientAdapter extends EventEmitter implements IJupyterClient
129127
this.ipythonAdapter.on('status', status => {
130128
this.emit('status', status);
131129
});
130+
this.ipythonAdapter.on('error', error => {
131+
this.emit('error', error);
132+
console.error(error);
133+
this.outputChannel.appendLine('Error received: ' + error);
134+
});
132135
this.ipythonAdapter.on('commanderror', (commandError: { command: string, id: string, trace: string }) => {
133136
this.outputChannel.appendLine(`Unhandled command Error from Jupyter. '${JSON.stringify(commandError)}'`);
134137
});

0 commit comments

Comments
 (0)