From 371fe768cb28525ade1cab87c2f51b8e118a8fb3 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 27 Jun 2026 18:33:12 +0800 Subject: [PATCH] fix: share SSL context across StreamHttpClient instances to reduce memory leaks Each StreamHttpClient() was calling ssl.create_default_context() which loads the full CA cert chain (~5-10KB) into memory. Under high concurrency (100+ parallel t2t model calls) this caused significant memory growth. Now uses a module-level singleton _SHARED_SSL_CONTEXT, created once and reused by all instances. --- appPublic/streamhttpclient.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/appPublic/streamhttpclient.py b/appPublic/streamhttpclient.py index c5f74a4..a5c1675 100755 --- a/appPublic/streamhttpclient.py +++ b/appPublic/streamhttpclient.py @@ -13,6 +13,15 @@ import os from appPublic.log import exception, debug use_socks5i_proxy=True + +# Shared SSL context to avoid recreating on every client instance +_SHARED_SSL_CONTEXT = None + +def _get_shared_ssl_context(): + global _SHARED_SSL_CONTEXT + if _SHARED_SSL_CONTEXT is None: + _SHARED_SSL_CONTEXT = ssl.create_default_context(cafile=certifi.where()) + return _SHARED_SSL_CONTEXT def set_use_socks5(use_or_not): global use_socks5_proxy use_socks5_proxy = use_or_not @@ -42,7 +51,7 @@ class StreamHttpClient: self.socks_urls_file = Path(f'{home}/.socksurls.txt') self.socks5_url = socks5_url self.socks_urls = set(self._load_socks_urls()) - self.ssl_context = ssl.create_default_context(cafile=certifi.where()) + self.ssl_context = _get_shared_ssl_context() def _load_socks_urls(self): if self.socks_urls_file.exists():