code: def _threaded_read(self):
      elements = [idx for idx in range(1, len(self.annotation_db))]
      pool = ThreadPool(processes=4)
  
      with tqdm.tqdm(
          total=len(elements), disable=not is_main()
      ) as pbar:
          for i, _ in enumerate(
              pool.imap_unordered(self._fill_cache, elements)
          ):
              if i % 100 == 0:
                  pbar.update(100)
      pool.close()
  
file_path: mmf/mmf/datasets/databases/features_database.py
imports: import logging
  from multiprocessing.pool import ThreadPool
  import tqdm
  from mmf.datasets.databases.image_database import ImageDatabase
  from mmf.datasets.databases.readers.feature_readers import FeatureReader
  from mmf.utils.distributed import is_main
  from mmf.utils.general import get_absolute_path
label_desc: Use image node_id 2 for calling the FeaturesDatabase obj's underlying member method code with example usage: obj._threaded_read() without return types