From 76ee4ac26a27df15d68cac8e65a222ad6f6f828c Mon Sep 17 00:00:00 2001 From: David Brochart Date: Tue, 8 Mar 2022 02:53:56 +0100 Subject: [PATCH] Fix in-process kernels --- examples/embedding/inprocess_qtconsole.py | 1 - examples/embedding/inprocess_terminal.py | 1 - ipykernel/control.py | 1 - ipykernel/debugger.py | 2 -- ipykernel/iostream.py | 9 ++++++--- ipykernel/ipkernel.py | 6 ++---- ipykernel/kernelapp.py | 3 --- ipykernel/kernelbase.py | 2 +- ipykernel/tests/test_eventloop.py | 2 -- ipykernel/trio_runner.py | 4 +++- ipykernel/zmqstream.py | 6 +++++- 11 files changed, 17 insertions(+), 20 deletions(-) diff --git a/examples/embedding/inprocess_qtconsole.py b/examples/embedding/inprocess_qtconsole.py index e00e5d93c..e964d1356 100644 --- a/examples/embedding/inprocess_qtconsole.py +++ b/examples/embedding/inprocess_qtconsole.py @@ -1,5 +1,4 @@ import os -import sys from IPython.lib import guisupport from qtconsole.inprocess import QtInProcessKernelManager diff --git a/examples/embedding/inprocess_terminal.py b/examples/embedding/inprocess_terminal.py index ab7da7ac3..9617d8ec2 100644 --- a/examples/embedding/inprocess_terminal.py +++ b/examples/embedding/inprocess_terminal.py @@ -1,5 +1,4 @@ import os -import sys from jupyter_console.ptshell import ZMQTerminalInteractiveShell diff --git a/ipykernel/control.py b/ipykernel/control.py index 059038a35..a88ed23ca 100644 --- a/ipykernel/control.py +++ b/ipykernel/control.py @@ -2,7 +2,6 @@ from threading import Thread - class ControlThread(Thread): def __init__(self, **kwargs): Thread.__init__(self, name="Control", **kwargs) diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index f74462f2c..ad8410ae5 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -6,8 +6,6 @@ import zmq from IPython.core.getipython import get_ipython from IPython.core.inputtransformer2 import leading_empty_lines -from tornado.locks import Event -from tornado.queues import Queue from zmq.utils import jsonapi try: diff --git a/ipykernel/iostream.py b/ipykernel/iostream.py index 2b19d7fcc..653451be5 100644 --- a/ipykernel/iostream.py +++ b/ipykernel/iostream.py @@ -18,7 +18,8 @@ import zmq from jupyter_client.session import extract_header -from zmq.eventloop.zmqstream import ZMQStream + +from .zmqstream import ZMQStream # ----------------------------------------------------------------------------- # Globals @@ -184,7 +185,7 @@ def stop(self): if not self.thread.is_alive(): return self.io_loop.call_soon_threadsafe(self.io_loop.stop) - self.thread.join() + # self.thread.join() # close *all* event pipes, created in any thread # event pipes can only be used from other threads while self.thread.is_alive() # so after thread.join, this should be safe @@ -458,7 +459,9 @@ def _schedule_flush(self): def _schedule_in_thread(): # FIXME: original code was: # self._io_loop.call_later(self.flush_interval, self._flush) - self._io_loop.call_soon_threadsafe(self._io_loop.call_later, self.flush_interval, self._flush) + self._io_loop.call_soon_threadsafe( + self._io_loop.call_later, self.flush_interval, self._flush + ) self.pub_thread.schedule(_schedule_in_thread) diff --git a/ipykernel/ipkernel.py b/ipykernel/ipkernel.py index 26b33f3cf..406e0e9e0 100644 --- a/ipykernel/ipkernel.py +++ b/ipykernel/ipkernel.py @@ -11,7 +11,6 @@ from IPython.core import release from IPython.utils.tokenutil import line_at_cursor, token_at_cursor from traitlets import Any, Bool, Instance, List, Type, observe, observe_compat -from zmq.eventloop.zmqstream import ZMQStream from .comm import CommManager from .compiler import XCachingCompiler @@ -20,6 +19,7 @@ from .kernelbase import Kernel as KernelBase from .kernelbase import _accepts_cell_id from .zmqshell import ZMQInteractiveShell +from .zmqstream import ZMQStream try: from IPython.core.interactiveshell import _asyncio_runner @@ -182,9 +182,7 @@ def start(self): self.debugpy_stream.on_recv(self.dispatch_debugpy, copy=False) super().start() if self.debugpy_stream: - asyncio.run_coroutine_threadsafe( - self.poll_stopped_queue(), self.control_thread.io_loop - ) + asyncio.run_coroutine_threadsafe(self.poll_stopped_queue(), self.control_thread.io_loop) def set_parent(self, ident, parent, channel="shell"): """Overridden from parent to tell the display hook and output streams diff --git a/ipykernel/kernelapp.py b/ipykernel/kernelapp.py index 0ec4c704c..e9b6de6e2 100644 --- a/ipykernel/kernelapp.py +++ b/ipykernel/kernelapp.py @@ -17,7 +17,6 @@ import zmq import zmq.asyncio - from IPython.core.application import ( BaseIPythonApplication, base_aliases, @@ -30,7 +29,6 @@ from jupyter_client.connect import ConnectionFileMixin from jupyter_client.session import Session, session_aliases, session_flags from jupyter_core.paths import jupyter_runtime_dir -from tornado import ioloop from traitlets import ( Any, Bool, @@ -44,7 +42,6 @@ ) from traitlets.utils import filefind from traitlets.utils.importstring import import_item -from zmq.eventloop.zmqstream import ZMQStream from .control import ControlThread from .heartbeat import Heartbeat diff --git a/ipykernel/kernelbase.py b/ipykernel/kernelbase.py index 798265ea0..680ad6f84 100644 --- a/ipykernel/kernelbase.py +++ b/ipykernel/kernelbase.py @@ -78,7 +78,7 @@ def _update_eventloop(self, change): """schedule call to eventloop from IOLoop""" loop = asyncio.get_event_loop() if change.new is not None: - loop.call_soon(self.enter_eventloop()) + loop.call_soon(self.enter_eventloop) session = Instance(Session, allow_none=True) profile_dir = Instance("IPython.core.profiledir.ProfileDir", allow_none=True) diff --git a/ipykernel/tests/test_eventloop.py b/ipykernel/tests/test_eventloop.py index 977f61f1c..19ea7785b 100644 --- a/ipykernel/tests/test_eventloop.py +++ b/ipykernel/tests/test_eventloop.py @@ -1,7 +1,5 @@ """Test eventloop integration""" -import pytest - from .utils import execute, flush_channels, start_new_kernel KC = KM = None diff --git a/ipykernel/trio_runner.py b/ipykernel/trio_runner.py index 476a0f2e8..bcad444cc 100644 --- a/ipykernel/trio_runner.py +++ b/ipykernel/trio_runner.py @@ -19,7 +19,9 @@ def initialize(self, kernel, io_loop): kernel.shell.magics_manager.magics["line"]["autoawait"] = lambda _: warnings.warn( "Autoawait isn't allowed in Trio background loop mode." ) - bg_thread = threading.Thread(target=io_loop.run_forever, daemon=True, name="AsyncioBackground") + bg_thread = threading.Thread( + target=io_loop.run_forever, daemon=True, name="AsyncioBackground" + ) bg_thread.start() def interrupt(self, signum, frame): diff --git a/ipykernel/zmqstream.py b/ipykernel/zmqstream.py index 2b0bfcd33..22ef608b4 100644 --- a/ipykernel/zmqstream.py +++ b/ipykernel/zmqstream.py @@ -1,4 +1,5 @@ import asyncio +from inspect import isawaitable class ZMQStream: @@ -21,7 +22,10 @@ def on_recv(self, callback, copy=True): async def recv_task(self, callback, copy): while True: - msg_list = await self.socket.recv_multipart(copy=copy) + msg_list = self.socket.recv_multipart(copy=copy) + if isawaitable(msg_list): + # in-process kernels are not async + msg_list = await msg_list callback(msg_list) def send_multipart(self, msg_list, flags=0, copy=True, track=False, **kwargs):