解决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() |
亲测有效,终于解决了一个大问题,解除了很大的隐患。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)