class_docstr: A ZMQ socket invoking a callback in the ioloop
docstr: Create a channel.
  
  Parameters
  ----------
  socket : :class:`zmq.Socket`
      The ZMQ socket to use.
  session : :class:`session.Session`
      The session to use.
  loop
      A pyzmq ioloop to connect the socket to using a ZMQStream
code: def __init__(self, socket, session, loop):
      """Create a channel.
  
      Parameters
      ----------
      socket : :class:`zmq.Socket`
          The ZMQ socket to use.
      session : :class:`session.Session`
          The session to use.
      loop
          A pyzmq ioloop to connect the socket to using a ZMQStream
      """
      super(ThreadedZMQSocketChannel, self).__init__()
  
      self.socket = socket
      self.session = session
      self.ioloop = loop
      evt = Event()
  
      def setup_stream():
          self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
          self.stream.on_recv(self._handle_recv)
          evt.set()
  
      self.ioloop.add_callback(setup_stream)
      evt.wait()
  
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 1 to create a new ThreadedZMQSocketChannel object from inherited base classes: object with example: obj = ThreadedZMQSocketChannel(socket, session, loop)