|
4 | 4 | import yaml |
5 | 5 | import tempfile |
6 | 6 | import tarfile |
| 7 | +from concurrent.futures import ThreadPoolExecutor, as_completed |
7 | 8 | from datetime import datetime |
8 | 9 | from io import StringIO |
9 | 10 | from pathlib import Path |
@@ -345,20 +346,37 @@ def _make_extra_dependency_description(self, dependency_name, dependency_data, d |
345 | 346 |
|
346 | 347 | dependencies[dependency_name] = dependency_description |
347 | 348 |
|
| 349 | + @staticmethod |
| 350 | + def _run_dependency_description_job(job): |
| 351 | + job_function, args = job |
| 352 | + dependency = {} |
| 353 | + job_function(*args, dependency) |
| 354 | + return dependency |
| 355 | + |
348 | 356 | def _dependencies_description(self): |
349 | 357 | dependencies = {} |
| 358 | + jobs = [] |
350 | 359 |
|
351 | 360 | for dependency in [self] + list(self.dependencies.values()): |
352 | | - self._make_conan_dependency_description(dependency, dependencies) |
| 361 | + jobs.append((self._make_conan_dependency_description, (dependency,))) |
353 | 362 |
|
354 | 363 | if "extra_dependencies" in dependency.conan_data: |
355 | 364 | for dependency_name, dependency_data in dependency.conan_data["extra_dependencies"].items(): |
356 | | - self._make_extra_dependency_description(dependency_name, dependency_data, dependencies) |
| 365 | + jobs.append((self._make_extra_dependency_description, (dependency_name, dependency_data))) |
357 | 366 |
|
358 | 367 | pip_requirements_summary = os.path.abspath(Path(self.generators_folder, "pip_requirements_summary.yml") ) |
359 | 368 | with open(pip_requirements_summary, 'r') as file: |
360 | 369 | for package_name, package_version in yaml.safe_load(file).items(): |
361 | | - self._make_pip_dependency_description(package_name, package_version, dependencies) |
| 370 | + jobs.append((self._make_pip_dependency_description, (package_name, package_version))) |
| 371 | + |
| 372 | + if not jobs: |
| 373 | + return dependencies |
| 374 | + |
| 375 | + max_workers = min(32, len(jobs)) |
| 376 | + with ThreadPoolExecutor(max_workers=max_workers) as executor: |
| 377 | + futures = [executor.submit(self._run_dependency_description_job, job) for job in jobs] |
| 378 | + for future in as_completed(futures): |
| 379 | + dependencies.update(future.result()) |
362 | 380 |
|
363 | 381 | return dependencies |
364 | 382 |
|
|
0 commit comments