From 4896c4bd9fc93f9ca9c8c287ce001e34c1cf6e5e Mon Sep 17 00:00:00 2001 From: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com> Date: Wed, 2 Nov 2022 23:43:42 -0500 Subject: [PATCH] fix: match requests pool_maxsize to num workers (#6805) This avoids trashing connections just to immediately re-create them when `num-worker` > 10. This should provide a pretty solid speedup on beefy machines. I'm not attaching any tests because this would be hard to test and if it doesn't crash with an unknown keyword argument or something it means it's probably going to be doing what we expect. --- src/poetry/installation/executor.py | 11 ++++++----- src/poetry/utils/authenticator.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/poetry/installation/executor.py b/src/poetry/installation/executor.py index 38e0065e31d..0a01fee2b98 100644 --- a/src/poetry/installation/executor.py +++ b/src/poetry/installation/executor.py @@ -60,11 +60,6 @@ def __init__( self._dry_run = False self._enabled = True self._verbose = False - self._authenticator = Authenticator( - config, self._io, disable_cache=disable_cache - ) - self._chef = Chef(config, self._env) - self._chooser = Chooser(pool, self._env, config) if parallel is None: parallel = config.get("installer.parallel", True) @@ -76,6 +71,12 @@ def __init__( else: self._max_workers = 1 + self._authenticator = Authenticator( + config, self._io, disable_cache=disable_cache, pool_size=self._max_workers + ) + self._chef = Chef(config, self._env) + self._chooser = Chooser(pool, self._env, config) + self._executor = ThreadPoolExecutor(max_workers=self._max_workers) self._total_operations = 0 self._executed_operations = 0 diff --git a/src/poetry/utils/authenticator.py b/src/poetry/utils/authenticator.py index 4da767919a1..8db92913043 100644 --- a/src/poetry/utils/authenticator.py +++ b/src/poetry/utils/authenticator.py @@ -17,7 +17,7 @@ import requests.auth import requests.exceptions -from cachecontrol import CacheControl +from cachecontrol import CacheControlAdapter from cachecontrol.caches import FileCache from filelock import FileLock @@ -128,6 +128,7 @@ def __init__( io: IO | None = None, cache_id: str | None = None, disable_cache: bool = False, + pool_size: int = 10, ) -> None: self._config = config or Config.create() self._io = io @@ -153,6 +154,7 @@ def __init__( self.get_repository_config_for_url = functools.lru_cache(maxsize=None)( self._get_repository_config_for_url ) + self._pool_size = pool_size def create_session(self) -> requests.Session: session = requests.Session() @@ -160,7 +162,13 @@ def create_session(self) -> requests.Session: if self._cache_control is None: return session - session = CacheControl(sess=session, cache=self._cache_control) + adapter = CacheControlAdapter( + cache=self._cache_control, + pool_maxsize=self._pool_size, + ) + session.mount("http://", adapter) + session.mount("https://", adapter) + return session def get_session(self, url: str | None = None) -> requests.Session: