解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题
django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题。如何解决请继续看。
scheduler = BackgroundScheduler() scheduler.add_job(testFunc, 'interval', seconds=60) scheduler.start()
解决方法:
要让Celery启动时让Django中的scheduler = BackgroundScheduler()失效,只让启动Django的manage.py runserver时定时任务有效果,避免两个进程同时调度定时任务,可以在启动Celery之前检查是否已经有一个Django进程在运行。
首先,在settings.py中添加以下代码:
import os
import sys
# 设置环境变量
os.environ['DJANGO_ENABLE_SCHEDULER'] = 'False'
# 检查是否已经有一个Django进程在运行
if 'runserver' in sys.argv:
os.environ['DJANGO_ENABLE_SCHEDULER'] = 'True'
然后,在启动定时任务的地方修改代码如下:
from apscheduler.schedulers.background import BackgroundScheduler
import os
def start_scheduler():
scheduler = BackgroundScheduler()
# 添加定时任务
# ...
scheduler.start()
if os.environ.get('DJANGO_ENABLE_SCHEDULER') == 'True':
start_scheduler()
亲测有效,终于解决了一个大问题,解除了很大的隐患。
浙公网安备 33010602011771号