- _feed_fallback 미러 OFF, LS cap/grace/hold RAM을 KIS·키움 spill과 정합 - LS 접근토큰 .ls_token_cache_*.json (재시작 재사용, revoke 루프 없음) - 호가 RAM을 틱과 동일 LIVE_FEED_FALLBACK(snap_time)로 컷, 필터 max_age=0은 유지 - 익절 지정가 로그에 실제 호가 벤더(kis/kiwoom/ls 1·2·3차) 표기 Co-authored-by: Cursor <cursoragent@cursor.com>
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
"""
|
|
WebSocket 재연결 대기 간격 — **REST 아님** (소켓 run_forever 끊김 후 재접속 전 sleep).
|
|
|
|
기본 시퀀스: 1 → 3 → 5 → 7 → 10초, 이후 10초 유지.
|
|
env ``WS_RECONNECT_DELAY_SECS`` (쉼표 구분, DB/env_config).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from typing import List, Tuple
|
|
|
|
from ..utils.env import get_env_from_db
|
|
|
|
_DEFAULT_DELAYS: Tuple[float, ...] = (1.0, 3.0, 5.0, 7.0, 10.0)
|
|
_cache: Tuple[float, ...] | None = None
|
|
|
|
|
|
def invalidate_ws_reconnect_delay_cache() -> None:
|
|
global _cache
|
|
_cache = None
|
|
|
|
|
|
def ws_reconnect_delays_sec() -> Tuple[float, ...]:
|
|
global _cache
|
|
if _cache is None:
|
|
raw = (
|
|
get_env_from_db("WS_RECONNECT_DELAY_SECS", "1,3,5,7,10")
|
|
or "1,3,5,7,10"
|
|
).strip()
|
|
parts: List[float] = []
|
|
for piece in raw.split(","):
|
|
piece = piece.strip()
|
|
if not piece:
|
|
continue
|
|
try:
|
|
val = float(piece)
|
|
except ValueError:
|
|
continue
|
|
if val >= 0:
|
|
parts.append(val)
|
|
_cache = tuple(parts) if parts else _DEFAULT_DELAYS
|
|
return _cache
|
|
|
|
|
|
def ws_reconnect_delay_for_attempt(attempt: int) -> float:
|
|
"""1-based 재연결 시도 번호 → 대기 초. 시퀀스 초과 시 마지막 값."""
|
|
if attempt < 1:
|
|
attempt = 1
|
|
delays = ws_reconnect_delays_sec()
|
|
idx = min(attempt - 1, len(delays) - 1)
|
|
return delays[idx]
|