解决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()

 亲测有效,终于解决了一个大问题,解除了很大的隐患。

 

posted @ 2024-03-01 13:30  万笑佛  阅读(220)  评论(1)    收藏  举报