問(wèn)題:
worker中使用到while死循環(huán)來(lái)遍歷任務(wù)牺陶,達(dá)到調(diào)度任務(wù)的目的捡需,所以,在使用supervisor管理celery 的worker時(shí)搭综,無(wú)法正常停止
解決:
- 使用信號(hào)機(jī)制
celery的信號(hào)常用的三種:Task Signals Worker Signals Eventlet Signals 全量信號(hào)點(diǎn)我見(jiàn)
Task Signals (不需要外部依賴庫(kù)):
例如: task_prerun worker運(yùn)行前
task_success worker運(yùn)行成功
task_failure worker運(yùn)行失敗
Worker Signals (不需要外部依賴庫(kù)):
例如: worker_ready worker初始化完畢后 指的是MainProcess
worker_init worker初始化時(shí) 指的是MainProcess
worker_process_init worker初始化時(shí) 子worker
worker_process_shutdown worker退出時(shí) 子worker
Eventlet Signals (依賴外部庫(kù) eventlet)
例如: eventlet_pool_preshutdown worker池子退出時(shí)調(diào)用 - 具體解決:
由于worker是死循環(huán)垢箕,所以在第一次發(fā)送退出信號(hào)時(shí),celery默認(rèn)的是warm Shutdown兑巾,要等待worker執(zhí)行完任務(wù)后退出条获,需要手動(dòng)再發(fā)送一次Ctrl+C信號(hào)。
此時(shí)蒋歌,無(wú)論是[worker Signals]帅掘,還是【Task Signals】都沒(méi)有發(fā)送委煤。所以要使用此時(shí)會(huì)發(fā)送的信號(hào),通過(guò)Debug日志發(fā)現(xiàn)锄开,此時(shí)發(fā)送了【W(wǎng)orker: Stopping Pool...】素标,
也就是說(shuō)称诗,pool的信號(hào)應(yīng)該是發(fā)送了萍悴,通過(guò)比對(duì),應(yīng)該是eventlet信號(hào)發(fā)送了寓免,所以使用這個(gè)信號(hào)就ok了癣诱。 - 踩得小坑
eventlet屬于是第三方的信號(hào)機(jī)制,所以: - 安裝第三方庫(kù) eventlet
2.在啟動(dòng)worker時(shí)袜香,開(kāi)啟eventlet撕予, -P eventlet