celery定时任务重复提交的BUG

本文详细描述了使用Celery设置定时任务时遇到的重复执行问题,分析了问题原因在于Celery的任务重传机制与定时任务冲突。提出了在Redis中添加分布式锁的方法作为解决方案,通过设置唯一task_id来防止重复任务执行。尽管此方法能在执行时避免重复,但并不能阻止任务加入队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现问题

用celery设置定时任务,前端传入time,让任务每天定时定点执行,但是结果却出现重复的任务:

可以发现
可以发现4月4号从18点开始,每隔1个小时celery就会received一个定时task,而且该task_id是同一个,一直到晚上22点整,所有定时任务(注意:是同一个定时任务)同时开始运行。
ps:系统居然没被拖垮,不幸中的万幸。

问题原因分析

celery在执行定时任务时与celery的任务失效重传机制时有冲突未解决,应该算是个系统bug吧。简单的说就是,定时任务没到指定的执行时间之前,celery不会收到任务,但是celery会默认每隔1小时(Visibility timeout)后重传该任务,等到了任务执行时间点,所有被重传的任务会一拥而上,同时执行,所以会看到几十个相同任务同时执行。

解决办法—在redis中加分布式锁,下面开始演示,注意:演示时用同一个字符串模拟代替实际存入redis中的同一个task_id

settings.py中,配置缓存队列为:redis://127.0.0.1:6379/7

CACHES = {
   
   
    "default": {
   
   
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/7",
        'TIMEOUT': 7 * 24 * 60 * 60,
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值