使用Celery Once来防止Celery重复执行同一个任务

在使用Celery的时候发现有的时候Celery会将同一个任务执行两遍。比如相同的任务在不同的worker中被分别执行,并且时间只相差几毫秒,使用Celery Once可以处理这一情况。Celery Once是利用 Redis 加锁来实现, Celery OnceTask类基础上实现了QueueOnce类,该类提供了任务去重的功能,所以在使用时,我们自己实现的方法需要将QueueOnce设置为base

1
2
3
@task(base=QueueOnce, once={'graceful': True})
def handel(*args, **kwargs):
pass

说明:once参数表示,在遇到重复方法时的处理方式,默认 graceful 为 False,那样 Celery 会抛出 AlreadyQueued 异常,手动设置为 True,则静默处理。

另外如果要手动设置任务的key,可以指定keys参数, 例:

1
2
3
4
@celery.task(base=QueueOnce, once={'keys': ['a']})
def slow_add(a, b):
sleep(30)
return a + b

参考:https://blog.csdn.net/qq_41333582/article/details/83899884

-------------本文结束感谢您的阅读-------------