内容简介:最近有需求需要用到定时任务,我选择了
最近有需求需要用到定时任务,我选择了 django-apscheduler ,但是在开发环境进行自测时发现 同一时间运行了三次
gunicorn 配置如下图,这里的 cpu 为 1 ,刚好启动的进程数为 3 。
gunicorn 在启动的时候开启了三个进程,但是这里的 apscheduler 也就启动三个,这时会 造成定时任务重复运行
解决问题
网上的解决方法主要有两种:
-
gunicorn启动的时候加上--preload参数,或者preload_app=True,默认为False - 第二种是使用 锁 的方式来控制
我这里也是使用锁来实现,具体代码如下:
from django.conf import settings
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
from django_redis import get_redis_connection
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
scheduler.remove_all_jobs()
key = "lock"
redis_cli = get_redis_connection(settings.REDIS_CACHE_ALIAS)
data = redis_cli.get(key)
if data is None:
redis_cli.set(key, "lock", ex=10)
register_events(scheduler)
scheduler.start()
启动时设置一个 key ,后面几个进程启动发现 key 已设置就不启动 apscheduler , 设置过期时间为启动后 key 的释放,这里只是一个简单实现思路,可以参考 并发锁 去实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 解决lighttpd运行后浏览器无法渲染html
- 解决lighttpd运行后浏览器无法渲染html
- Python程序在Pycharm中运行系统命令异常-解决方案
- 解决手动运行脚本执行正常而放入crontab后不正常的方法
- 解决因为机器性能问题导致docker-compose运行容器超时的问题
- docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法详解(卷1)——算法基础
[美]蒂姆·拉夫加登(Tim Roughgarden) / 徐波 / 人民邮电出版社 / 2019-1-1 / 49
算法是计算机科学领域最重要的基石之一。算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发。 算法详解系列图书共有4卷,本书是第1卷——算法基础。本书共有6章,主要介绍了4个主题,它们分别是渐进性分析和大O表示法、分治算法和主方法、随机化算法以及排序和选择。附录A和附录B简单介绍了数据归纳法和离散概率的相关知识。本书的每一章均有小测验、章末习题和编程题,这为读者的自我检查以及进一步学习提......一起来看看 《算法详解(卷1)——算法基础》 这本书的介绍吧!