From 1eaf608ece975ce7f10e25871fd5605476350779 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Fri, 17 Apr 2026 00:32:21 +0800 Subject: [PATCH] 1 --- backend/app/api/auth.py | 5 ----- .../__pycache__/recommender.cpython-313.pyc | Bin 26584 -> 26351 bytes backend/app/engine/recommender.py | 19 ++++-------------- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/backend/app/api/auth.py b/backend/app/api/auth.py index 27aaab10..bb4ac1a6 100644 --- a/backend/app/api/auth.py +++ b/backend/app/api/auth.py @@ -325,11 +325,6 @@ async def data_reset(req: DataResetRequest, admin: dict = Depends(get_current_ad await db.commit() - # 清除内存缓存 - from app.engine.recommender import _latest_result - import app.engine.recommender as recommender_mod - recommender_mod._latest_result = None - logger.info(f"管理员 {admin['username']} 执行数据重置: mode={req.mode}, deleted={deleted}") return { diff --git a/backend/app/engine/__pycache__/recommender.cpython-313.pyc b/backend/app/engine/__pycache__/recommender.cpython-313.pyc index bce8b6da925adc4658669315ef6e0eb0b47dd298..531df4db9003a024f9d5dc03916f0129b9a8afb0 100644 GIT binary patch delta 3247 zcmbW3eQZ&L*MBq~i+Oq3PU7{`7ICbnOC z{Q_&s8t5k}ErDIp^3iH&T7e3!MRPS(gLMnpwCxWHh)SThby6k5NB?M&!9J)qZRgyC zBt_~U+mr6^opZn5x#ym9@4I%9j9(zOJ63C+08fSOi^L0^2W>9XRw4+84%QCI9n!`C z`;B@2Ae|RBKkE#ahI2cL!+B6F9VPWjIKNETE^jB)6}FZMw3OG1VH?)cvT3b=YvrKL z@35HQJN07N&gqI#_9di*{nWmS6tmCmPmw~l)UjZm7kyZP zKyMmiyo;8zs3SxI>^(h)<^5vZAWc^8wZx%M}5{`csQ4M zvY(WHE|OsOodqXEm?z|2Jops$*@y@ua9X+yu@r%G(-jC8;5H_hAp~tSfK^W;HY2tm zIuQTMbhKI!B!T+bq}NTJWCaykumR`bE63obs{n=qp_YtN`UonfZiq&mHnNiy-nMnv zrx5WN0L;VeXVbGF5&{W?O}B;J!gYu5iX(8<61XG>E?WZk?&L$mi?$MSfH>uYrV@e+ zoOvXWUV?JxTWl=~R@Ho)iMLLk7#lu#W9ama;o&L!SSskUXfPe^L%7+2pexW1qVi1( z16Lf?S1r|-U)$zkLZD)EmwqWPg zn66RUiJdUK3{z6wp(g2OMwTD7%!xI2VtEzW!aiMIxeUD#G}BkHdoE36dLwB~SLtgw z2anU&QQC*VuGGaUR&-Zm7#q^swx_8dq*jV+d|x!gC3QSDG9u_64=ni1iib&jqn*td9 zv=Oll(aTC3=5H$o5!?Vra)u^QRx%pZ)wm(|s?TK%Dbt^t$`mQ7rh`S4JNyWa{{ez0 zhZo1m89k-*JfY2~=k!pmzfX-%Cj@)9;ZfV$IOH%OQv_h7ut)?K{HMWVIt98V>-)~{ zB+|jYT>Wz|It=0$osxlA5WrVJdh|ZFvR^eWR(RBuXU7}g$aQ$2$*`oNv=`D$S5tlL z<)#aymTg?;Bb{vLx_U<~@3BpTlZ^*LhJCc|_jZ1{@DM_W($j3;W9?Oy*j0{caWz;n z8$omcd+>wlhbXat5*=wsn$)0c@LH;Y{+NSjSWD zQIvSf<)GAvz*M6Og75e-l(?6<=eet`6oYU!!ziB-E}{*Pq$xc@wVm8(gQR%IaVzIs zKkYC&V+DBTK2vFgXFtCiE@V%Bf1??0@~^jkOa^D;@PV^}f0`S~&E?jcagGOU&YNQ{ zSSm~(1=Hy^$G8z}JdfaJ;*WsG!z&k=E%cZ0SK9 zMU*1Ao46Uc<1ghU9LWLLWDBR1!7$Lk&YI(O$? zvpaWNCzUc%aVj<;!0QhZe_h%V`5UT#ZQMY}%85?#c|!7zZ@Mesdt#R)lB!d_y8^r> b^58G)xbOJD<%;E45uD6pJ9;{0JpTR*TQCS$ delta 3505 zcmbVOYfK#16`ngYJG-zf>;lVUc`eJb>^d02%WtQ_;9%!LYcG!F1~aU87qYO+;JbrK zv1J@rO6=Idc5m%EF{zyVsGPKJ-R_S%N>vxrC{d-TAVNXmbgD zav!0tV5Uo;MSNBaX5lO?UKrW=s02o(omLYVZWMzKK35hj3TAh@`ARNdk%Ku47R!UV zogP>zY?Ome*J?Ca5zK>+iotyTvUkCJ0UuTVoB2XM=j#;%#q21#Z8tL2cu0>Xb(Kbw zLvfwy;%bt|ekiUYes)V-?zdoM@LEs&^MVjj1i>u?#af|O2ud}QS9nek*rhVqq8RFYn2QbQX88w?Mruq=z=@>Teeg2m1UL8WOZN2{l%`So$7RX_mrjk zR#xHI$kl@4L$+Blo1IbCq|I7{QtzSmy9%38Dn|o?-F0l_$jF=`}EWQt`Q(rhvrx8zTtmv9Z9!bSZzbAs7obu|?AnJ4=Y(qe^v;m`B!O13iSiP%h5f!<3#>#NeCKH>tpPBUWH=NL zQTjLzOg(Weq|1`x~7NXbPG=GLWm$l5qc1M5x$1- z6hatb2m7-pzZ}D7ID4V|2cxt{qlwT!I12F%=}D@=+M!fsMS)y{ajO76oUV?B;jJ+XEsek&&aq zP9v(WMMB?Dd#ILBBfH)f?%-Ew8T(C@dsGKefo_>ZZ$A|d2)E46gZqD%RWfBMx$f{@ zarkDezA4!^ZS~ztVi6rI^OHA;PkzhfC%D-Mmju!`;l48l@LxAnv2;UQB{m5(eX>2> z{b0wCv&9_;3HDCdw}}XkKViWGj`+rY4&5kvxz!DwLKv5 zol^{t;hf+8LeIG$07_wvCK1ZmXa0h1!ysm246srk#9+K;##KG-sy?@K# zIx(G9J!PrB?(ki4_-CyCDcL`5_1{Zo!HWmiHJixKNwXwhGJ%v@7Wi1PzkpxyA$R~r zK4EhmURM9;`zw(OR0S~1Lj(N-+VH?4AD~)!m!#dOgp@E$@#vmtoOZIBy4S5s_`$B! zRgs9zRmgkTz`FLGfU0 z=dpQPG{l-mc|9jZn031$P}l0$lP*@&FziEz<`wC;KzyJAGW|BfNdT2yZ19pQcC8^0 z%Z72lX~=y^ZGd8#&_Vij397ULj?+koYWIKCpdi)$L3zD4Gl&k3ruFeYW#}w z8ou&6%W5hnWvsf%ZF&bL@={xx-j^T}`Ky0Yj)fE;JVQyS9|7Wo?~LDve)h-J)e5h) zl2q}UqiJba1=J3}-fj7a)Uuaby`-D{ptUir7FV!@*<9-fc7EpZy20Sl^X$Wo+e<1z zG~}=ri3ai)tA*}EjV=~@wrc&$C}K($@fE%1i?1WIorv>|K) z2xQDBZ84J~jFzn&bUz_Mnjcmv)N|@qrCibmN1GZ;~_GgLA#t$ z%_wn3nNeDY(2t-X@N~a{5)by`iD;u(cZ=Mi+#;NfRdB2(;J;HF=Dr#v!MVhL zJJ_Y|dGr4gyU`HB)ztOvTP^S}v9kLj8C|TohnUa5#C_u4ac3?6!Nv3?-hpGn0;d=H z{t{m%aPcw%uZVPz-0p(=H8EchdvF<{GWF7~O`@~PFso`r3#+POj%&TWv4LKChW#OO zc$CM;3Yvx-iG_6|OI1Sy&~)ejXhC0oS_}8n95k4ZfSruG5sDG;CxGGsY{>CgQm4Zx zO0fZ*VyB@ogmHu-1Rgx@9OfO)FGvgb*s!ciXpy0K^fCG;Siwe=#3OxHB7}U-zKk}G zmQ@_cJT4#CPgt)Ao>@i6bRO$`rSnMFf%L0(=KN)ib9De@T z(}b*??GpDAl76=1u7J{|&bI@d5O;PZlh Nv6a2i(=KBh{1>-TB2NGS diff --git a/backend/app/engine/recommender.py b/backend/app/engine/recommender.py index 07981289..a5ac4e8b 100644 --- a/backend/app/engine/recommender.py +++ b/backend/app/engine/recommender.py @@ -15,9 +15,6 @@ from app.db import tables logger = logging.getLogger(__name__) -# 内存中的最新推荐结果 -_latest_result: dict | None = None - # 扫描锁:防止同时触发两次扫描 _scan_lock = asyncio.Lock() _scan_running = False @@ -25,11 +22,11 @@ _scan_running = False async def refresh_recommendations(trade_date: str = None, scan_session: str = "manual") -> dict: """刷新推荐列表(带扫描锁防止并发)""" - global _latest_result, _scan_running + global _scan_running if _scan_lock.locked(): logger.warning("扫描已在执行中,跳过本次触发") - return _latest_result or {"market_temp": None, "hot_sectors": [], "recommendations": []} + return await _load_today_from_db() async with _scan_lock: _scan_running = True @@ -41,8 +38,6 @@ async def refresh_recommendations(trade_date: str = None, scan_session: str = "m rec.scan_session = scan_session rec.created_at = datetime.now() - _latest_result = result - # 持久化到数据库 await _save_to_db(result) @@ -260,18 +255,12 @@ async def get_performance_stats() -> dict: async def get_latest_recommendations() -> dict: - """获取最新推荐结果""" - if _latest_result: - return _latest_result - # 如果内存中没有,从数据库加载今日的 + """获取最新推荐结果(直接从数据库读取,不做内存缓存)""" return await _load_today_from_db() async def get_latest_sectors() -> list[SectorInfo]: - """获取最新的板块热度数据(只读缓存,不触发扫描)""" - if _latest_result and _latest_result.get("hot_sectors"): - return _latest_result["hot_sectors"] - # 内存中没有,从数据库加载 + """获取最新的板块热度数据(从数据库读取,不触发扫描)""" return await _load_sectors_from_db()