class_docstr: Run a pyzmq ioloop in a thread to send and receive messages
      
docstr: Stop the channel's event loop and join its thread.
  
  This calls :meth:`~threading.Thread.join` and returns when the thread
  terminates. :class:`RuntimeError` will be raised if
  :meth:`~threading.Thread.start` is called again.
code: def stop(self):
      """Stop the channel's event loop and join its thread.
  
      This calls :meth:`~threading.Thread.join` and returns when the thread
      terminates. :class:`RuntimeError` will be raised if
      :meth:`~threading.Thread.start` is called again.
      """
      if self.ioloop is not None:
          self.ioloop.add_callback(self.ioloop.stop)
      self.join()
      self.close()
      self.ioloop = None
  
imports: from __future__ import absolute_import
  import atexit
  import errno
  import sys
  from threading import Thread, Event
  import time
  from zmq import ZMQError
  from zmq.eventloop import ioloop, zmqstream
  from traitlets import Type, Instance
  from jupyter_client.channels import HBChannel
  from jupyter_client import KernelClient
label_desc: Use image node_id 5 for calling the IOLoopThread obj's underlying member method code with example usage: obj.stop() without return types