code: def do_check_artifact_cache(self, vts, post_process_cached_vts=None):
      
      if not vts:
        return [], [], []
  
      read_cache = self._cache_factory.get_read_cache()
      items = [(read_cache, vt.cache_key, vt.current_results_dir if self.cache_target_dirs else None)
               for vt in vts]
      res = self.context.subproc_map(call_use_cached_files, items)
  
      cached_vts = []
      uncached_vts = []
      uncached_causes = []
  
      # Note that while the input vts may represent multiple targets (for tasks that overrride
      # check_artifact_cache_for), the ones we return must represent single targets.
      # Once flattened, cached/uncached vts are in separate lists. Each uncached vts is paired
      # with why it is missed for stat reporting purpose.
      for vt, was_in_cache in zip(vts, res):
        if was_in_cache:
          cached_vts.extend(vt.versioned_targets)
        else:
          uncached_vts.extend(vt.versioned_targets)
          uncached_causes.extend(repeat(was_in_cache, len(vt.versioned_targets)))
          if isinstance(was_in_cache, UnreadableArtifact):
            self._cache_key_errors.update(was_in_cache.key)
  
      if post_process_cached_vts:
        post_process_cached_vts(cached_vts)
      for vt in cached_vts:
        vt.update()
      return cached_vts, uncached_vts, uncached_causes
docs: Checks the artifact cache for the specified list of VersionedTargetSets.
  
      Returns a tuple (cached, uncached, uncached_causes) of VersionedTargets that were
      satisfied/unsatisfied from the cache.