diff --git a/modules/shared_options.py b/modules/shared_options.py index b9037bf35..e8b09f1a6 100644 --- a/modules/shared_options.py +++ b/modules/shared_options.py @@ -128,6 +128,7 @@ options_templates.update(options_section(('system', "System", "system"), { "disable_mmap_load_safetensors": OptionInfo(False, "Disable memmapping for loading .safetensors files.").info("fixes very slow loading speed in some cases"), "hide_ldm_prints": OptionInfo(True, "Prevent Stability-AI's ldm/sgm modules from printing noise to console."), "dump_stacks_on_signal": OptionInfo(False, "Print stack traces before exiting the program with ctrl+c."), + "concurrent_git_fetch_limit": OptionInfo(16, "Number of simultaneous extension update checks ", gr.Slider, {"step": 1, "minimum": 1, "maximum": 100}).info("reduce extension update check time"), })) options_templates.update(options_section(('profiler', "Profiler", "system"), { diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index 23aff7096..b973c08d0 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -1,5 +1,6 @@ import json import os +from concurrent.futures import ThreadPoolExecutor import threading import time from datetime import datetime, timezone @@ -106,18 +107,24 @@ def check_updates(id_task, disable_list): exts = [ext for ext in extensions.extensions if ext.remote is not None and ext.name not in disabled] shared.state.job_count = len(exts) - for ext in exts: - shared.state.textinfo = ext.name + lock = threading.Lock() + def _check_update(ext): try: ext.check_updates() except FileNotFoundError as e: if 'FETCH_HEAD' not in str(e): raise except Exception: - errors.report(f"Error checking updates for {ext.name}", exc_info=True) + with lock: + errors.report(f"Error checking updates for {ext.name}", exc_info=True) + with lock: + shared.state.textinfo = ext.name + shared.state.nextjob() - shared.state.nextjob() + with ThreadPoolExecutor(max_workers=max(1, int(shared.opts.concurrent_git_fetch_limit))) as executor: + for ext in exts: + executor.submit(_check_update, ext) return extension_table(), ""