feat: SSH连接池串行化 + Polymarket/数据源统一走连接池

- 新增ssh_proxy_pool.py: 全局单例连接池,队列串行化SSH请求
- stockstats_utils.py: _fetch_via_ssh改用连接池
- polymarket.py: 跳过本地直接走SSH连接池
- 消除并发SSH资源竞争问题
This commit is contained in:
小钰 committed 2026-07-08 14:34:41 +08:00
1 parent 5207a2bf18
commit 709ea0fd78
3 files changed
+131 -45

No files matched your search

+5 -32
View File
@@ -13,11 +13,9 @@ import json
import logging
from datetime import datetime, timezone
import subprocess
import requests
from .stockstats_utils import _get_ssh_config
from .ssh_proxy_pool import ssh_proxy_fetch_json
logger = logging.getLogger(__name__)
@@ -35,35 +33,10 @@ DEFAULT_LIMIT = 6
def _request(path: str, params: dict) -> dict:
url = f"{GAMMA_BASE}/{path}"
try:
response = requests.get(url, params=params, timeout=DIRECT_TIMEOUT)
response.raise_for_status()
return response.json()
except requests.RequestException:
# Fallback: fetch through SSH proxy
logger.info("Polymarket direct failed, trying SSH proxy for %s...", path)
query = "&".join(f"{k}={v}" for k, v in params.items())
full_url = f"{url}?{query}"
host, port, password = _get_ssh_config()
cmd = [
"sshpass", "-p", password,
"ssh", "-o", "StrictHostKeyChecking=no",
"-o", "ConnectTimeout=15",
"-p", str(port), f"root@{host}",
f'curl -s "{full_url}"'
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=REQUEST_TIMEOUT)
except subprocess.TimeoutExpired:
raise requests.RequestException("SSH proxy timed out")
if result.returncode != 0:
raise requests.RequestException(f"SSH proxy failed: {result.stderr}")
if not result.stdout or not result.stdout.strip():
raise requests.RequestException("SSH proxy returned empty response")
try:
return json.loads(result.stdout)
except json.JSONDecodeError as e:
raise requests.RequestException(f"SSH proxy returned invalid JSON: {e}")
# Skip local request, go directly through SSH proxy
query = "&".join(f"{k}={v}" for k, v in params.items())
full_url = f"{url}?{query}"
return ssh_proxy_fetch_json(full_url, timeout=REQUEST_TIMEOUT)
def _parse_json_list(value) -> list: