class_docstr: Run a pyzmq ioloop in a thread to send and receive messages
      
code: def _notice_exit():
      # Class definitions can be torn down during interpreter shutdown.
      # We only need to set _exiting flag if this hasn't happened.
      if IOLoopThread is not None:
          IOLoopThread._exiting = True
  
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 2 for calling the IOLoopThread obj's underlying member method code with example usage: obj._notice_exit() without return types