| | """A kernel client for in-process kernels.""" |
| |
|
| | |
| | |
| |
|
| | from typing import List |
| |
|
| | from jupyter_client.channelsabc import HBChannelABC |
| |
|
| | |
| | |
| | |
| |
|
| |
|
| | class InProcessChannel: |
| | """Base class for in-process channels.""" |
| |
|
| | proxy_methods: List[object] = [] |
| |
|
| | def __init__(self, client=None): |
| | """Initialize the channel.""" |
| | super().__init__() |
| | self.client = client |
| | self._is_alive = False |
| |
|
| | def is_alive(self): |
| | """Test if the channel is alive.""" |
| | return self._is_alive |
| |
|
| | def start(self): |
| | """Start the channel.""" |
| | self._is_alive = True |
| |
|
| | def stop(self): |
| | """Stop the channel.""" |
| | self._is_alive = False |
| |
|
| | def call_handlers(self, msg): |
| | """This method is called in the main thread when a message arrives. |
| | |
| | Subclasses should override this method to handle incoming messages. |
| | """ |
| | msg = "call_handlers must be defined in a subclass." |
| | raise NotImplementedError(msg) |
| |
|
| | def flush(self, timeout=1.0): |
| | """Flush the channel.""" |
| |
|
| | def call_handlers_later(self, *args, **kwds): |
| | """Call the message handlers later. |
| | |
| | The default implementation just calls the handlers immediately, but this |
| | method exists so that GUI toolkits can defer calling the handlers until |
| | after the event loop has run, as expected by GUI frontends. |
| | """ |
| | self.call_handlers(*args, **kwds) |
| |
|
| | def process_events(self): |
| | """Process any pending GUI events. |
| | |
| | This method will be never be called from a frontend without an event |
| | loop (e.g., a terminal frontend). |
| | """ |
| | raise NotImplementedError |
| |
|
| |
|
| | class InProcessHBChannel: |
| | """A dummy heartbeat channel interface for in-process kernels. |
| | |
| | Normally we use the heartbeat to check that the kernel process is alive. |
| | When the kernel is in-process, that doesn't make sense, but clients still |
| | expect this interface. |
| | """ |
| |
|
| | time_to_dead = 3.0 |
| |
|
| | def __init__(self, client=None): |
| | """Initialize the channel.""" |
| | super().__init__() |
| | self.client = client |
| | self._is_alive = False |
| | self._pause = True |
| |
|
| | def is_alive(self): |
| | """Test if the channel is alive.""" |
| | return self._is_alive |
| |
|
| | def start(self): |
| | """Start the channel.""" |
| | self._is_alive = True |
| |
|
| | def stop(self): |
| | """Stop the channel.""" |
| | self._is_alive = False |
| |
|
| | def pause(self): |
| | """Pause the channel.""" |
| | self._pause = True |
| |
|
| | def unpause(self): |
| | """Unpause the channel.""" |
| | self._pause = False |
| |
|
| | def is_beating(self): |
| | """Test if the channel is beating.""" |
| | return not self._pause |
| |
|
| |
|
| | HBChannelABC.register(InProcessHBChannel) |
| |
|