class_docstr: Async Mixin on top of implementation of BaseDataLoader. It contains a seperate thread
  which reads batch from self._iterate() and push them in the queue. The self.__iter__() function
  will pop the batch from the queue.
  If async_loader_queue_size is set to 0, the data loader will not work in async mode.
  For example:
      class PytorchAsyncDataLoader(AsyncDataLoaderMixin, PytorchDataLoader):
class_docstr_tok: ["Async","Mixin","on","top","of","implementation","of","BaseDataLoader",".","It","contains","a","seperate","thread","which","reads","batch","from","self._iterate","(",")","and","push","them","in","the","queue",".","The","self.__iter__","(",")","function","will","pop","the","batch","from","the","queue",".","If","async_loader_queue_size","is","set","to","0",",","the","data","loader","will","not","work","in","async","mode",".","For","example",":","class","PytorchAsyncDataLoader","(","AsyncDataLoaderMixin",",","PytorchDataLoader",")",":"]
docstr: Start worker thread to load data asynchronously.
  User need to implement self._iterate() to read the data.
docstr_tok: ["Start","worker","thread","to","load","data","asynchronously",".","User","need","to","implement","self._iterate","(",")","to","read","the","data","."]
code: def _async_worker(self):
      """
      Start worker thread to load data asynchronously.
      User need to implement self._iterate() to read the data.
      """
      try:
          c = 0
          while not self.finished_event.is_set():
              for batch in self._iterate():
                  if self.finished_event.is_set():
                      break
                  self.queue.put(batch)
  
                  if self.debug_data_loader:
                      print(
                          f"_async_worker[{self.async_loader_queue_size}], push batch #{c}."
                      )
                      c += 1
  
              if self.debug_data_loader:
                  print(
                      f"_async_worker[{self.async_loader_queue_size}], finish reading at #{c}, reset debugging counter, append None to queue."
                  )
                  c = 0
  
              self.queue.put(None)
      except Exception as ex:
          self.queue.put(ex)
          self.queue.put(None)
      finally:
          self.queue.put(None)
  
      print(f"_async_worker[{self.async_loader_queue_size}], stoped")
  
file_path: horovod/horovod/data/data_loader_base.py
imports: from queue import Queue, Empty
  from threading import Thread, Event
label_desc: Use image node_id 3 for calling the AsyncDataLoaderMixin obj's underlying member method code with example usage: obj._async_worker() without return types