Files
intelligence_system/system_management/scheduler/__pycache__/task_scheduler.cpython-312.pyc
T

132 lines
22 KiB
Plaintext
Raw Normal View History

Ë
-ziªPãóÄddlZddlZddlZddlmZddlmZmZmZmZddl Z ddl
Z
ddl m Z m
Z
ddlZddlmZddlmZddlmZej,d«ZGd „d«Zy)
éN)Údatetime)ÚDictÚListÚOptionalÚAny)ÚThreadPoolExecutorÚ as_completed)ÚSQLAlchemyError)Ú
MySQLAgent)ÚCrossPlatformLogÚ
TaskSchedulerc
óeZdZddeedefdZdefdZdde deeeffd „Z
d
eee fde fd Z d
eee fddfd Z
d
ZddededefdZdedeee fddfdZ ddedededededef dZdefdZdeeee ffdZdeeeffdZy)r
NÚ db_configÚ max_workerscóút|xsi«|_t|¬«|_t j
|«|_ddddœ|_t j«|_ tjd|«y)u1åˆå§‹åŒ–任务调度器(基于Cron表达å¼ï¼‰)rr©õæˆåŠŸõ失败õ总数u5任务调度器已åˆå§‹åŒ–,最大工作线程数: N) r ÚdbrÚexecutorÚ threadingÚ SemaphoreÚ_running_semaphoreÚ hourly_statsÚLockÚhourly_stats_lockÚlogÚinfo)Úselfrrs úQD:\Idea Project\intelligence_system\system_management\scheduler\task_scheduler.pyÚ__init__zTaskScheduler.__init__scä˜Yš_¨"ÓŒÜ*°{ÔCˆŒ
ä"+×"5Ñ"5°kÓ"BˆÔà'(°AÀÑÔÜ!*§¡Ó!1ˆÔÜ ÐÈ
ÐÚ module_pathcó–|rt|t«s td«|jd«}d}t t |«dd«D]>}dj
|d|«} tj|«}||d}|}|D]+} t|| «std|d| «t|| «}Œ-t|t«rt|d«r#tt|d««rt|d«cS |«}
t|
d«r#tt|
d««rt|
d«cStd |jd
«t|«r|cSt|d«r#tt|d««rt|d«cStd |d «td
|dt|««#t$rYŒŒwxYw#t$r
} | }Yd} ~ Œ|d} ~ wwxYw)uè§£æžæ¨¡å—è·¯å¾„ï¼Œæ”¯æŒæ¨¡å—ã€æ¨¡å—内类/函数,并返回å¯è°ƒç”¨å¯¹è±¡
兼容以下形å¼ï¼š
- package.module -> 期望模å—内存在 main()
- package.module.ClassName -> 调用 ClassName.main() 或实例化åŽè°ƒç”¨ main()
- package.module.func_name -> 直接调用该函数
- package.module.ClassName.method_name -> 调用指定方法
u无效的模å—路径Ú.Nréÿÿÿÿu在 u 中未找到属性: Úmainõç±» u- 缺少å¯è°ƒç”¨çš„ main() 作为任务入å£u路径 u= 未解æžåˆ°å¯è°ƒç”¨å…¥å£ï¼ˆç¼ºå°‘ main 或ä¸å¯è°ƒç”¨ï¼‰õæ¨¡å— u 导入/è§£æžå¤±è´¥: )Ú
isinstanceÚstrÚ ImportErrorÚsplitÚrangeÚlenÚjoinÚ importlibÚ
import_moduleÚhasattrÚAttributeErrorÚgetattrÚtypeÚcallableÚ ExceptionÚ__name__) r r$ÚpartsÚlast_import_errorÚ module_nameÚmoduleÚ
attr_chainÚtargetÚattrÚinstanceÚes r!Ú_resolve_callablezTaskScheduler._resolve_callableñ¤*¨[¼#Ô">ÜÐ ×! #Ó&ˆØ Ðô”s˜5“z 1 b×)ˆŸ(™( ¨! -ˆ%
Ü"×Ó=Ø" 1 2˜Y
ð Û&" 6¨4Ô,¨t°F°8Ð;PÐQUÐPVÐ-WÓ$ V¨TÓ2 ˜f¤dÔ˜v .´8¼GÀFÈFÓ<SÔ3TÜ& v¨vÓÙ#)£8˜Ü" 8¨VÔÄ'È(ÐTZÓB[Ô9\Ü#*¨8°VÓ#<Ò)¨4°·±Ð/@Ð@mÐ)nÓ˜!’Mô˜6 6Ô*¬x¼ÀÈÓ8OÔ/PÜ" 6¨6Ó$ w¨{¨mÐ;xÐ%yÓzðI*ôT˜G K =Ð0FÄsÐK\ÓG]ÐF^Ð`øô'Ùðûôò
Ø$%Ðûð
úsIÁ BF2Ã,3F#Ä"%F2Å
,F2Å9F2Æ# F/Æ,F2Æ.F/Æ/F2Æ2 GÆ;GÇGÚprint_empty_statusÚreturncó8ddddœ} tjd«}tj|«j d¬«}t
j
d|jd««|jjd|fd ¬
«}t|«|d <|jr!|rtd |jd««|Sg}|j«D]J\}}|j«} |j|j j#|j$| ««ŒLt'|«D].}
|
j)«r|d
xxdz
cc<n
|dxxdz
cc<Œ0|j05|j2d
xx|d
z
cc<|j2dxx|dz
cc<|j2dxx|d z
cc<ddd«t
j5d|d |d
|d¬«|S#t*$r:} t
j-dt/| «d¬«|dxxdz
cc<Yd} ~ Œöd} ~ wwxYw#1swYŒsxYw#t6$r/} t
j-dt/| «d¬«|cYd} ~ Sd} ~ wt*$r#} t
j-dd¬«|cYd} ~ Sd} ~ wwxYw)检查并执行所有到期的任务,优化空任务处ç†å’Œå¼‚常容错
Args:
print_empty_status: æ˜¯å¦æ‰“å°ç©ºä»»åŠ¡çŠ¶æ€ï¼ˆé»˜è®¤False,é¿å…频ç¹è¾“出)
r)õ 总任务数rrú
Asia/ShanghaiN©Útzinfou当剿£€æŸ¥æ—¶é—´: ú%Y-%m-%d %H:%M:%Sa 
SELECT *
FROM main_task
WHERE is_active = 1
AND next_run_time <= %s
AND is_running = 0
ORDER BY next_run_time
F)ÚparamsÚis_printrIu6当剿²¡æœ‰åˆ°æœŸçš„任务,等待新任务加入...réru任务线程执行失败: T©Úexc_inforu任务调度周期完æˆu2æ•°æ®åº“æ“作失败,将在下次轮询é‡è¯•: u6调度器周期执行异常,将在下次轮询é‡è¯•)ÚpytzÚtimezonerÚnowÚreplacerÚdebugÚstrftimerÚ query_to_dfr0ÚemptyÚprintÚiterrowsÚto_dictÚappendrÚsubmitÚ_process_single_taskr Úresultr9Úerrorr,rrrr
) r rFraÚtzrUÚtasks_dfÚfuturesÚtaskÚ task_copyÚfuturerDs r!Úcheck_and_run_tasksz!TaskScheduler.check_and_run_tasksZs„ð #$¨q¸>ˆð< ä˜Ó/ˆ—,‘,˜rÓ"×*°$Ð7ˆ I‰IÐ,¨S¯\©\Ð:MÓ-NÐ,OÐ —ww×,/ð9<°vÀuðNˆ&)¨£]ˆF ~Š~áÐRÐSV×S_ÑS_Ð`sÓStÐRuÐ
ðˆGØ.‘ ŸL™L›N ؘtŸ}™}×3°D×4MÑ4MÈyÓ ' /ð—}}”ؘxÓ(¨AјxÓ(¨AÑ(øð ××! +¨v°hÑ/?Ñ×! +¨v°hÑ/?Ñ×! +¨v°nÑ/EÑ
H‰HØ# ˜˜
ô
ð ˆMøô!—I‘IÐ :¼3¸q»6¸(ÐCÈd˜8ÓÑ$ûð*ú÷
'ûôò Ü I‰IÐJÌ3ÈqË6È(ÐSÐ^bˆIÔ MûÜò Ü I‰IÐNÐY]ˆ Mûð úszˆB:H7ÃA-H7Ä1+G%ÅH7Å*AH+Æ9+H7Ç% H(Ç.0H#ÈH7È#H(È(H7È+H4È0H7È7 JÉ$I*É$JÉ* JÉ6JÊJÊJrgcóœ|d}|d}tj||¬«}|jd|« |jj «t j |jdd««}tj|«jd¬«}|j|d |d
œ«|jj|j|j««|j!d «y #t"$rÌ}|j%d
t'|«d ¬«tj«t)j*d¬«z} |j|dd|dœ«n5#t"$r)} |j%dt'| «d ¬«Yd} ~ nd} ~ wwxYw |jj-«n#t"$rYnwxYwYd}~yd}~wwxYw)u$处ç†å•个任务(线程安全)Útask_idÚ task_name©rlrmu开始执行任务: Ú time_zonerJNrKrP)Ú
is_runningÚ
last_run_timeu$任务已æäº¤è‡³åŽå°æ‰§è¡Œé˜Ÿåˆ—Tu任务执行失败: rQé©ÚminutesÚfailedr©Úlast_run_statusrpÚ
next_run_timeu#任务失败åŽçŠ¶æ€æ›´æ–°å¤±è´¥: F)rÚbindrrÚacquirerSrTÚgetrrUrVÚ_update_task_statusrr_Ú_run_task_asyncÚcopyrWr9rbr,ÚpdÚ TimedeltaÚrelease)
r rgrlrmÚtask_logrcÚ current_timerDÚnext_retry_timeÚ
update_errs
r!r`z"TaskScheduler._process_single_task ày‘/ˆØ˜Ñ%ˆ Ü—8‘8 G°yAˆØ
Ð,¨Y¨KÐ( à × ˜tŸx™x¨ °_ÓFˆ#Ÿ<™<¨Ó+×3¸@ˆLà × $ Ø!-ñ/ô
ð
M‰M× Ñ  ×!5Ñ!5°t·y±y³{Ô N‰NÐ øäò Ø N‰NÐ1´#°a³&°Ð:ÀTˆ 'Ÿl™ln¬r¯|©|ÀBÔ/GÑGˆ
gØ×Ø'/Ø"#Ø%4ñ3õøô
ò
gØÐ!DÄSÈÃ_ÐDUÐVÐae×fûð
gúð
Ø×'×1øÜò
Ùð
úôûð- úsg·B>C6Ã6 G Ã?A
GÅ
E!Å GÅ! FÅ*FÆ GÆFÆGÆF2Æ1GÆ2 F>Æ;GÆ=F>Æ>GÇG cóØ|d}|d}tj||¬«} |j|«|j|d|j dd«¬«}|j |dd |d
d z|d œ«|j
d
|« |jj«y#t$r{|jdd¬«tj«tjd¬«z} |j |dd |dœ«n"#t$r|jdd¬«YnwxYwYŒŸwxYw#t$rYywxYw# |jj«w#t$rYwwxYwxYw)uB在åŽå°çº¿ç¨‹ä¸­æ‰§è¡Œä»»åŠ¡ä¸»ä½“ï¼Œå¹¶åœ¨ç»“æŸåŽæ›´æ–°çжæ€rlrmrnÚcron_expressionrorJ)Ú cron_exprroÚsuccessrÚ run_countrP)rwrprxu任务执行æˆåŠŸ: u任务åŽå°æ‰§è¡Œå¤±è´¥TrQrrrsrurvu)任务失败åŽçŠ¶æ€æ›´æ–°å¤±è´¥(åŽå°)N)rryÚ_execute_task_logicÚ_calculate_next_run_timer{r|rr9rbrrUrr€rr)r rgrlrmrrxr„s r!r}zTaskScheduler._run_task_asyncÑs„ày‘/ˆØ˜Ñ%ˆ Ü—8‘8 G°yAˆð! à × $ TÔ ÐŸ(™( ;°ÓˆMð
× $ WØ#,ØØ! Ñ2Ø!.ñ /ô
ð
M‰Mа Ð 
Ø×'×1øôò
[Ø N‰NЈ &Ÿl™ln¬r¯|©|ÀBÔ/GÑGˆ
[Ø×Ø'/Ø"#Ø%4ñ3õøô
ò
[ØÐJÐUYÖ
[üð
[ûôò
Ùð
ûð
Ø×'×1øÜò
Ùð
ýs£A(B'Â D.Â'AD+Ã/DÄD+ÄD%Ä"D+Ä$D%Ä%D+Ä(D=Ä*D+Ä+D=Ä. D:Ä9D:Ä=E)Ä?EÅE)Å E&Å#E)Å%E&Å&E)c óÐ|jd«}|s td« |jd«}t|«dkrtd|«dj |dd«}|d}d} d
dl}|j|«} t| |«std
|d|«t| |«}
t|
|«std|d|«t|
|«} d
dl
} d}
t| t«r| }
n˜t| t «r| }
n… | j#| «}t%|j&j)««}|rL|d
j*dk(r:|d