feat: SSH连接池串行化 + Polymarket/数据源统一走连接池
- 新增ssh_proxy_pool.py: 全局单例连接池,队列串行化SSH请求 - stockstats_utils.py: _fetch_via_ssh改用连接池 - polymarket.py: 跳过本地直接走SSH连接池 - 消除并发SSH资源竞争问题
This commit is contained in:
1 parent
5207a2bf18
commit
709ea0fd78
3 files changed
+131
-45
No files matched your search
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user