def fetch_hashes(self, candidates: Iterable[Candidate]) -> None:
        """Fetch hashes for candidates in parallel"""
        from concurrent.futures import ThreadPoolExecutor

        def do_fetch(candidate: Candidate) -> None:
            candidate.hashes = self.get_hashes(candidate)

        with ThreadPoolExecutor() as executor:
            executor.map(do_fetch, candidates)
Fetch hashes for candidates in parallel
src/pdm/models/repositories/base.py