From e660436c42c2f89623ea03e5aa13f01ef221a546 Mon Sep 17 00:00:00 2001 From: Brendan <2bndy5@gmail.com> Date: Thu, 4 Jul 2024 19:55:20 -0700 Subject: [PATCH] add config value to control font fetching max_workers resolves #351 --- docs/customization.rst | 6 ++++++ sphinx_immaterial/google_fonts.py | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/customization.rst b/docs/customization.rst index 91f931341..98a9080d3 100644 --- a/docs/customization.rst +++ b/docs/customization.rst @@ -742,6 +742,12 @@ Configuration Options bundles to the output directory. Source maps are helpful when developing the theme. +.. confval:: sphinx_immaterial_font_fetch_max_workers + + The number of workers executed in parallel when fetching a cache of the specified + :themeconf:`font`. If not specified or set to :python:`0`, then the system's CPU + count is used by default. + .. _version_dropdown: Version Dropdown diff --git a/sphinx_immaterial/google_fonts.py b/sphinx_immaterial/google_fonts.py index 8f355063a..5d47e3f18 100644 --- a/sphinx_immaterial/google_fonts.py +++ b/sphinx_immaterial/google_fonts.py @@ -52,7 +52,7 @@ def _adjust_css_urls(css_content: bytes, renamed_fonts: Dict[str, str]) -> str: ) -_MAX_CONCURRENT_FETCHES = 128 +_MAX_CONCURRENT_FETCHES_KEY = "sphinx_immaterial_font_fetch_max_workers" _TTF_FONT_PATHS_KEY = "sphinx_immaterial_ttf_font_paths" @@ -60,11 +60,16 @@ def _adjust_css_urls(css_content: bytes, renamed_fonts: Dict[str, str]) -> str: def add_google_fonts(app: sphinx.application.Sphinx, fonts: List[str]): cache_dir = os.path.join(get_cache_dir(app), "google_fonts") static_dir = os.path.join(app.outdir, "_static") + max_workers = cast( + int, app.config.config_values.get(_MAX_CONCURRENT_FETCHES_KEY, 0) + ) + if not max_workers: + max_workers = os.cpu_count() or 1 # _static path font_dir = os.path.join(static_dir, "fonts") os.makedirs(font_dir, exist_ok=True) - with concurrent.futures.ThreadPoolExecutor(max_workers=33) as executor: + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: def to_thread(fn, *args, **kwargs) -> asyncio.Future: return asyncio.wrap_future(executor.submit(fn, *args, **kwargs)) @@ -200,6 +205,7 @@ def _builder_inited(app: sphinx.application.Sphinx): def setup(app: sphinx.application.Sphinx): app.setup_extension("sphinx_immaterial.external_resource_cache") app.connect("builder-inited", _builder_inited) + app.add_config_value(_MAX_CONCURRENT_FETCHES_KEY, default=0, rebuild="", types=int) return { "parallel_read_safe": True,