2016-09-21 123 views
3

我有一個芹菜工作進程在celery.signals.worker_process_init中爲外部服務器創建一個套接字。如果無法建立連接並且引發異常,則芹菜工作者無法啓動,這是預期的行爲。如何殺死芹菜工作進程以重啓進程

該套接字類別還使用threading.Timer發送偶爾的心跳包。不幸的是,因爲Timer線程沒有特殊的異常處理,所以如果連接發生什麼事情,我的worker不會退出。

我開始從我的套接字讀取和寫入操作,並嘗試了一堆東西,優雅地停止當前的工作進程捕獲異常:

sys.exit(1) # Doesn't kill the worker process (because it's running in a thread?) 

下一個嘗試,我看到它在celery/billiard問題某處提到:

raise SystemExit("Socket error") # Same, I guess 

這個工程:

os.kill(os.getpid(), signal.SIGHUP) 

但是芹菜工人主管過程進入快速旋轉過程,產生立即離開的芹菜工作者過程,而不是在幾次嘗試後放棄和死亡。

有沒有更好的方式來表示芹菜任務之外的芹菜工作者死亡過程?

回答

0

我有類似的問題。我最終創建了一個單獨的腳本來管理工作人員。

創建一個無限循環,休眠所需時間,然後創建/終止工作進程。

while True: 
    time.sleep(5) 
    # create workers if possible 
    # kill stale workers if not required.