class_docstr: Builds a Enqueuer from a PyDataset.
  
  Args:
      py_dataset: A `keras.utils.PyDataset` object.
      use_multiprocessing: use multiprocessing if True, otherwise threading
      shuffle: whether to shuffle the data at the beginning of each epoch
docstr: Submits request to the executor and queue the `Future` objects.
docstr_tok: ["Submits","request","to","the","executor","and","queue","the","`","Future","`","objects","."]
code: def _run(self):
      """Submits request to the executor and queue the `Future` objects."""
      indices = list(range(len(self.py_dataset)))
      if self.shuffle:
          random.shuffle(indices)
      self._send_py_dataset()  # Share the initial py_dataset
      while True:
          with closing(self.executor_fn(_SHARED_SEQUENCES)) as executor:
              for i in indices:
                  if self.stop_signal.is_set():
                      return
  
                  self.queue.put(
                      executor.apply_async(get_index, (self.uid, i)),
                      block=True,
                  )
  
              # Done with the current epoch, waiting for the final batches
              self._wait_queue()
  
              if self.stop_signal.is_set():
                  # We're done
                  return
  
          # Call the internal on epoch end.
          self.py_dataset.on_epoch_end()
          self._send_py_dataset()
  
imports: import multiprocessing.dummy
  import queue
  import random
  import threading
  import time
  import warnings
  import weakref
  from contextlib import closing
  import numpy
  import tree
  from keras.api_export import keras_export
  from keras.trainers.data_adapters import data_adapter_utils
  from keras.trainers.data_adapters.data_adapter import DataAdapter
label_desc: Use image node_id 4 for calling the OrderedEnqueuer obj's underlying member method code with example usage: obj._run() without return types