解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题

  django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题。如何解决请继续看。

1
2
3
scheduler = BackgroundScheduler()
scheduler.add_job(testFunc, 'interval', seconds=60)
scheduler.start()

 解决方法:

 

要让Celery启动时让Django中的scheduler = BackgroundScheduler()失效,只让启动Django的manage.py runserver时定时任务有效果,避免两个进程同时调度定时任务,可以在启动Celery之前检查是否已经有一个Django进程在运行。

 

首先,在settings.py中添加以下代码:

1
2
3
4
5
6
7
8
9
import os
import sys
 
# 设置环境变量
os.environ['DJANGO_ENABLE_SCHEDULER'] = 'False'
 
# 检查是否已经有一个Django进程在运行
if 'runserver' in sys.argv:
    os.environ['DJANGO_ENABLE_SCHEDULER'] = 'True'

 然后,在启动定时任务的地方修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
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 @   万笑佛  阅读(163)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示