          self._stop_event = self.EVENT()
          self._buffer_tokens = self.QUEUE()
          for i in range(buffers):
              self._buffer_tokens.put(i)
          self._result_tokens = self.QUEUE()
          worker_data, self.data = self._create_data(shapes, ctype, buffers)
          proc_args = {
              'data': worker_data,
              'stop_event': self._stop_event,
              'target': self._target_func,
 
</s> remove         self._buffer_tokens = self.QUEUE()
 </s> add         self._buffer_tokens = in_queue </s> remove                 if stop_event.is_set() or i is None:
 </s> add                 if stop_event.is_set() or i is None or i == "EOF": </s> remove     def __init__(self, method, shapes,
 </s> add     def __init__(self, method, shapes, in_queue, out_queue, </s> remove             self.samples.images[side] = batcher.compile_sample(self.batch_size)
            if timelapse_kwargs:
 </s> add             if do_preview:
                self.samples.images[side] = batcher.compile_sample(self.batch_size)
            if do_timelapse: </s> remove             loss[side] = batcher.train_one_batch(is_preview_iteration)
            if not is_preview_iteration:
 </s> add             loss[side] = batcher.train_one_batch(do_preview)
            if not do_preview and not do_timelapse:
        self._result_tokens = out_queue
          self._stop_event = self.EVENT()
          self._buffer_tokens = self.QUEUE()
          for i in range(buffers):
              self._buffer_tokens.put(i)
        self._result_tokens = out_queue
          worker_data, self.data = self._create_data(shapes, ctype, buffers)
          proc_args = {
              'data': worker_data,
              'stop_event': self._stop_event,
              'target': self._target_func,
keep keep keep keep replace keep keep keep keep keep
 Minor FixedProducerDispatcher changes. Fix timelapse bug 
lib/multithreading.py