class_docstr: Run a pyzmq ioloop in a thread to send and receive messages
      
docstr: Run my loop, ignoring EINTR events in the poller
code: def run(self):
      """Run my loop, ignoring EINTR events in the poller"""
      if "asyncio" in sys.modules:
          # tornado may be using asyncio,
          # ensure an eventloop exists for this thread
          import asyncio
  
          asyncio.set_event_loop(asyncio.new_event_loop())
      self.ioloop = ioloop.IOLoop()
      # signal that self.ioloop is defined
      self._start_event.set()
      while True:
          try:
              self.ioloop.start()
          except ZMQError as e:
              if e.errno == errno.EINTR:
                  continue
              else:
                  raise
          except Exception:
              if self._exiting:
                  break
              else:
                  raise
          else:
              break
  
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 4 for calling the IOLoopThread obj's underlying member method code with example usage: obj.run() without return types