Fix positions page hang by moving recommend refresh to background

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-25 17:29:10 +08:00
parent 04b6f5e72d
commit a56370d2af
3 changed files with 163 additions and 70 deletions
+17 -37
View File
@@ -24,12 +24,10 @@ from position_sizing import (
normalize_sizing_mode,
)
from recommend_store import (
load_recommend_cache,
recommend_cache_needs_refresh,
recommend_payload,
refresh_recommend_cache,
)
from recommend_stream import recommend_hub, start_recommend_worker
from recommend_stream import recommend_hub, schedule_recommend_refresh, start_recommend_worker
from position_stream import position_hub, start_position_worker
from ctp_reconnect import start_ctp_reconnect_worker
from ctp_premarket_connect import start_ctp_premarket_connect_worker
@@ -100,6 +98,20 @@ def install_trading(app, *, login_required, require_nav, get_db, get_setting, se
return "固定金额"
return "固定手数"
def _schedule_recommend_refresh() -> None:
from db_conn import DB_PATH
schedule_recommend_refresh(
db_path=DB_PATH,
get_capital_fn=_capital,
quote_fn=_main_quote,
init_tables_fn=lambda c: init_strategy_tables(c),
get_mode_fn=lambda: get_trading_mode(get_setting),
get_max_margin_pct_fn=lambda: get_max_margin_pct(get_setting),
get_sizing_mode_fn=lambda: get_sizing_mode(get_setting),
get_fixed_lots_fn=lambda: get_fixed_lots(get_setting),
)
def _recommend_payload(conn) -> dict:
mode = get_trading_mode(get_setting)
return recommend_payload(
@@ -937,41 +949,9 @@ def install_trading(app, *, login_required, require_nav, get_db, get_setting, se
conn.commit()
sizing = get_sizing_mode(get_setting)
max_pct = get_max_margin_pct(get_setting)
rec_loaded = load_recommend_cache(conn)
if recommend_cache_needs_refresh(rec_loaded, capital=capital):
try:
refresh_recommend_cache(
conn, capital, _main_quote, trading_mode=mode, max_margin_pct=max_pct,
)
except Exception as exc:
logger.warning("positions recommend refresh failed: %s", exc)
rec_cache = _recommend_payload(conn)
if not rec_cache.get("rows") and capital > 0:
try:
from product_recommend import list_product_recommendations
from recommend_store import (
enrich_recommend_rows,
filter_affordable_recommendations,
filter_recommend_by_sizing,
)
live_rows = filter_affordable_recommendations(
list_product_recommendations(
capital, _main_quote, max_margin_pct=max_pct, trading_mode=mode,
)
)
if live_rows:
enriched = enrich_recommend_rows(
live_rows, capital, max_margin_pct=max_pct, trading_mode=mode,
)
rec_cache["rows"] = filter_recommend_by_sizing(
enriched,
sizing_mode=sizing,
fixed_lots=get_fixed_lots(get_setting),
)
rec_cache["updated_at"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
except Exception as exc:
logger.warning("positions recommend live fallback failed: %s", exc)
if rec_cache.get("needs_refresh"):
_schedule_recommend_refresh()
return render_template(
"trade.html",
trading_mode=mode,