From e4d6cbd0201b2b00c0b7910ad4091de0ba0112a4 Mon Sep 17 00:00:00 2001 From: Maciej Olko Date: Tue, 4 Feb 2025 17:32:52 +0100 Subject: [PATCH 1/2] Parallelize main loop with ThreadPoolExecutor --- generate.py | 58 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/generate.py b/generate.py index 22758cb77..552c29b98 100644 --- a/generate.py +++ b/generate.py @@ -8,6 +8,8 @@ # "docutils", # ] # /// +import concurrent.futures +import itertools import subprocess from collections.abc import Iterator from dataclasses import dataclass @@ -46,30 +48,44 @@ def get_completion_progress() -> Iterator['LanguageProjectData']: subprocess.run(['make', '-C', cpython_dir / 'Doc', 'venv'], check=True) subprocess.run(['make', '-C', cpython_dir / 'Doc', 'gettext'], check=True) languages_built = dict(build_status.get_languages(session := Session())) - for language, repo in get_languages_and_repos(devguide_dir): - built = language.code in languages_built - if repo: - completion, translators_data = get_completion(clones_dir, repo) - visitors_num = ( - get_number_of_visitors(language.code, session) if built else 0 - ) - else: - completion = 0.0 - translators_data = TranslatorsData(0, False) - visitors_num = 0 - yield LanguageProjectData( - language, - repo, - completion, - translators_data, - visitors_num, - built, - in_switcher=languages_built.get(language.code), - uses_platform=language.code in contribute.pulling_from_transifex, - contribution_link=contribute.get_contrib_link(language.code, repo), + with concurrent.futures.ThreadPoolExecutor() as executor: + return executor.map( + get_project_data, + *zip(*get_languages_and_repos(devguide_dir)), + itertools.repeat(languages_built), + itertools.repeat(clones_dir), + itertools.repeat(session), ) +def get_project_data( + language: Language, + repo: str, + languages_built: dict[str, bool], + clones_dir: str, + session: Session, +) -> 'LanguageProjectData': + built = language.code in languages_built + if repo: + completion, translators_data = get_completion(clones_dir, repo) + visitors_num = get_number_of_visitors(language.code, session) if built else 0 + else: + completion = 0.0 + translators_data = TranslatorsData(0, False) + visitors_num = 0 + return LanguageProjectData( + language, + repo, + completion, + translators_data, + visitors_num, + built, + in_switcher=languages_built.get(language.code), + uses_platform=language.code in contribute.pulling_from_transifex, + contribution_link=contribute.get_contrib_link(language.code, repo), + ) + + @dataclass(frozen=True) class LanguageProjectData: language: Language From 4f15527ec7059ad327879a2bb8d89c2bbe85d639 Mon Sep 17 00:00:00 2001 From: Maciej Olko Date: Wed, 5 Feb 2025 16:18:01 +0100 Subject: [PATCH 2/2] Revert removing an import --- generate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/generate.py b/generate.py index 2c433826e..250da5218 100644 --- a/generate.py +++ b/generate.py @@ -10,6 +10,7 @@ # /// import concurrent.futures import itertools +import logging import subprocess from collections.abc import Iterator from dataclasses import dataclass