              # alternative batch_wrapper.get and batch_wrapper.free can be used
              with batch_wrapper as batch:
                  send_batch_to_trainer(batch)
      """
      EVENT = mp.Event
      QUEUE = mp.Queue
  
      def __init__(self, method, shapes,
                   args=tuple(), kwargs={}, ctype=c_float, workers=1, buffers=None):
          logger.debug("Initializing %s: (method: '%s', shapes: %s, args: %s, kwargs: %s, "
                       "ctype: %s, workers: %s, buffers: %s)", self.__class__.__name__, method,
 
</s> remove     def __init__(self, method, shapes,
 </s> add     def __init__(self, method, shapes, in_queue, out_queue, </s> remove     def train_one_batch(self, is_preview_iteration):
 </s> add     def train_one_batch(self, do_preview): </s> remove         if log_queue and log_level is not None and mp.get_start_method() != "fork":
            set_root_logger(log_level, queue=log_queue)
 </s> add         set_root_logger(log_level, queue=log_queue)
    CTX = mp.get_context("spawn")
    EVENT = CTX.Event
              # alternative batch_wrapper.get and batch_wrapper.free can be used
              with batch_wrapper as batch:
                  send_batch_to_trainer(batch)
      """
    CTX = mp.get_context("spawn")
    EVENT = CTX.Event
    CTX = mp.get_context("spawn")
    EVENT = CTX.Event
  
      def __init__(self, method, shapes,
                   args=tuple(), kwargs={}, ctype=c_float, workers=1, buffers=None):
          logger.debug("Initializing %s: (method: '%s', shapes: %s, args: %s, kwargs: %s, "
                       "ctype: %s, workers: %s, buffers: %s)", self.__class__.__name__, method,
keep keep keep keep replace replace keep keep keep keep keep
 Minor FixedProducerDispatcher changes. Fix timelapse bug 
lib/multithreading.py