|
|
""" Defines a KernelClient that provides signals and slots.
|
|
|
"""
|
|
|
import atexit
|
|
|
import errno
|
|
|
from threading import Thread
|
|
|
import time
|
|
|
|
|
|
import zmq
|
|
|
# import ZMQError in top-level namespace, to avoid ugly attribute-error messages
|
|
|
# during garbage collection of threads at exit:
|
|
|
from zmq import ZMQError
|
|
|
from zmq.eventloop import ioloop, zmqstream
|
|
|
|
|
|
from IPython.external.qt import QtCore
|
|
|
|
|
|
# Local imports
|
|
|
from IPython.utils.traitlets import Type, Instance
|
|
|
from IPython.kernel.channels import HBChannel
|
|
|
from IPython.kernel import KernelClient
|
|
|
from IPython.kernel.channels import InvalidPortNumber
|
|
|
from IPython.kernel.threaded import ThreadedKernelClient, ThreadedZMQSocketChannel
|
|
|
|
|
|
from .kernel_mixins import QtKernelClientMixin
|
|
|
from .util import SuperQObject
|
|
|
|
|
|
class QtHBChannel(SuperQObject, HBChannel):
|
|
|
# A longer timeout than the base class
|
|
|
time_to_dead = 3.0
|
|
|
|
|
|
# Emitted when the kernel has died.
|
|
|
kernel_died = QtCore.Signal(object)
|
|
|
|
|
|
def call_handlers(self, since_last_heartbeat):
|
|
|
""" Reimplemented to emit signals instead of making callbacks.
|
|
|
"""
|
|
|
# Emit the generic signal.
|
|
|
self.kernel_died.emit(since_last_heartbeat)
|
|
|
|
|
|
from IPython.core.release import kernel_protocol_version_info
|
|
|
|
|
|
major_protocol_version = kernel_protocol_version_info[0]
|
|
|
|
|
|
class QtZMQSocketChannel(ThreadedZMQSocketChannel,SuperQObject):
|
|
|
"""A ZMQ socket emitting a Qt signal when a message is received."""
|
|
|
message_received = QtCore.Signal(object)
|
|
|
|
|
|
def process_events(self):
|
|
|
""" Process any pending GUI events.
|
|
|
"""
|
|
|
QtCore.QCoreApplication.instance().processEvents()
|
|
|
|
|
|
|
|
|
def call_handlers(self, msg):
|
|
|
"""This method is called in the ioloop thread when a message arrives.
|
|
|
|
|
|
It is important to remember that this method is called in the thread
|
|
|
so that some logic must be done to ensure that the application level
|
|
|
handlers are called in the application thread.
|
|
|
"""
|
|
|
# Emit the generic signal.
|
|
|
self.message_received.emit(msg)
|
|
|
|
|
|
|
|
|
class QtKernelClient(QtKernelClientMixin, ThreadedKernelClient):
|
|
|
""" A KernelClient that provides signals and slots.
|
|
|
"""
|
|
|
|
|
|
iopub_channel_class = Type(QtZMQSocketChannel)
|
|
|
shell_channel_class = Type(QtZMQSocketChannel)
|
|
|
stdin_channel_class = Type(QtZMQSocketChannel)
|
|
|
hb_channel_class = Type(QtHBChannel)
|
|
|
|