因为项目中有延时任务,如果使用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