class_docstr: The server maintains the port and hands off the requests to workers
  
  example of use:
  
  context = zmq.Context()
  with KnimeBridgeServer(
      context,
      "tcp://127.0.0.1:4000", # server address
      "inproc://Notify        # kill notify address
      ) as server:
      notify_socket = context.socket(zmq.PUB)
      notify_socket.bind("inproc://Notify")
      ....
      notify_socket.send("Stop")
class_docstr_tok: ["The","server","maintains","the","port","and","hands","off","the","requests","to","workers","example","of","use",":","context","=","zmq.Context","(",")","with","KnimeBridgeServer","(","context",",","``","tcp",":","\/\/127.0.0.1:4000","''",",","#","server","address","``","inproc",":","\/\/Notify","#","kill","notify","address",")","as","server",":","notify_socket","=","context.socket","(","zmq.PUB",")","notify_socket.bind","(","``","inproc",":","\/\/Notify","''",")","....","notify_socket.send","(","``","Stop","''",")"]
docstr: Handle the pipeline info message
docstr_tok: ["Handle","the","pipeline","info","message"]
code: def pipeline_info(self, session_id, message_type, message):
      """Handle the pipeline info message"""
      LOGGER.info("Handling pipeline info request")
      pipeline_txt = message.pop(0).bytes
      pipeline = cellprofiler_core.pipeline.Pipeline()
      try:
          pipeline.loadtxt(StringIO(pipeline_txt))
      except Exception as e:
          LOGGER.warning(
              "Failed to load pipeline: sending pipeline exception"
          )
          self.raise_pipeline_exception(session_id, str(e))
          return
      input_modules, other_modules = self.split_pipeline(pipeline)
      channels = self.find_channels(input_modules)
      type_names, measurements = self.find_measurements(
          other_modules, pipeline
      )
      body = json.dumps([channels, type_names, measurements])
      msg_out = [
          zmq.Frame(session_id),
          zmq.Frame(),
          zmq.Frame(PIPELINE_INFO_REPLY_1),
          zmq.Frame(body),
      ]
      self.socket.send_multipart(msg_out)
  
imports: import json
  import logging
  import threading
  import uuid
  from io import StringIO
  import numpy
  import zmq
  from cellprofiler_core.constants.measurement import GROUP_NUMBER, GROUP_INDEX, OBJECT_NUMBER, EXPERIMENT, MCA_AVAILABLE_POST_RUN, COLTYPE_FLOAT, COLTYPE_INTEGER, COLTYPE_VARCHAR, IMAGE_NUMBER
  from cellprofiler_core.constants.workspace import DISPOSITION_SKIP, DISPOSITION_CANCEL
  from cellprofiler_core.image import Image
  from cellprofiler_core.measurement import Measurements
  from cellprofiler_core.module import Module
  from cellprofiler_core.setting.text import ImageName
  import cellprofiler_core.object
  import cellprofiler_core.pipeline
  import cellprofiler_core.workspace
label_desc: Use image node_id 7 for calling the KnimeBridgeServer obj's underlying member method code with example usage: obj.pipeline_info(session_id, message_type, message) without return types