天天看點

django中 celery 如何優雅重新開機

因為項目中有延時任務,如果使用kill -9 直接KILL程序,會導緻現有任務無法在下次啟動時被加載,這裡使用官方推薦的信号機制,這時celery的主線程會将待完成的任務記錄在 broker中(部落客用的是redis,而且沒有改任何配置),這時會生成一個叫 celery的key,裡面記錄了未完成的任務,在celery下次啟動時會去重新加載這些任務。

優雅的重新開機celery:

import os
f = '/var/run/celery/celery.pid'
if os.path.exists(f):
    pid = open(f,'r').read()
    os.system(f'kill -HUP {pid}')
    os.remove(f)

os.system('celery multi start 1 -A your_pro -l INFO --pidfile=/var/run/celery/celery.pid  --logfile=/var/log/your_pro/celery.log')
           

參考: https://docs.celeryproject.org/en/stable/userguide/workers.html?highlight=HUP#restarting-the-worker