返回顶部
首页 > 资讯 > 精选 >怎么使用Celery Once来防止Celery重复执行同一个任务
  • 938
分享到

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

2023-06-25 12:06:38 938人浏览 安东尼
摘要

这篇文章给大家分享的是有关怎么使用Celery Once来防止Celery重复执行同一个任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用 Celery 的时候发现有的时候 Celery 会将同一个任务执行

这篇文章给大家分享的是有关怎么使用Celery Once来防止Celery重复执行同一个任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在使用 Celery 的时候发现有的时候 Celery 会将同一个任务执行两遍,我遇到的情况是相同的任务在不同的 worker 中被分别执行,并且时间只相差几毫秒。这问题我一直以为是自己哪里处理的逻辑有问题,后来发现其他人 也有类似的问题,然后基本上出问题的都是使用 Redis 作为 Broker 的,而我这边一方面不想将 Redis 替换掉,就只能在 task 执行的时候加分布式了。

不过在 Celery 的 issue 中搜索了一下,有人使用 Redis 实现了分布式锁,然后也有人使用了 Celery Once。 大致看了一下 Celery Once ,发现非常符合现在的情况,就用了下。

Celery Once 也是利用 Redis 加锁来实现, Celery Once 在 Task 类基础上实现了 QueueOnce 类,该类提供了任务去重的功能,所以在使用时,我们自己实现的方法需要将 QueueOnce 设置为 base

@task(base=QueueOnce, once={'graceful': True})

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

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

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

总得来说,分为几步

第一步,安装

pip install -U celery_once

第二步,增加配置

from celery import Celeryfrom celery_once import QueueOncefrom time import sleepcelery = Celery('tasks', broker='aMQp://guest@localhost//')celery.conf.ONCE = {  'backend': 'celery_once.backends.Redis',  'settings': {    'url': 'redis://localhost:6379/0',    'default_timeout': 60 * 60  }}

第三步,修改 delay 方法

example.delay(10)# 修改为result = example.apply_async(args=(10))

第四步,修改 task 参数

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

感谢各位的阅读!关于“怎么使用Celery Once来防止Celery重复执行同一个任务”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 怎么使用Celery Once来防止Celery重复执行同一个任务

本文链接: https://lsjlt.com/news/304446.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用 Celery Once 来防止 Celery 重复执行同一个任务
    在使用 Celery 的时候发现有的时候 Celery 会将同一个任务执行两遍,我遇到的情况是相同的任务在不同的 worker 中被分别执行,并且时间只相差几毫秒。这问题我一直以为是...
    99+
    2024-04-02
  • 怎么使用Celery Once来防止Celery重复执行同一个任务
    这篇文章给大家分享的是有关怎么使用Celery Once来防止Celery重复执行同一个任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用 Celery 的时候发现有的时候 Celery 会将同一个任务执行...
    99+
    2023-06-25
  • java定时任务怎么防止重复执行
    在Java中,可以使用定时任务来执行一段代码,但有时候我们希望在任务完成之前不再重复执行。有几种方法可以防止定时任务重复执行:1. ...
    99+
    2023-10-09
    java
  • Laravel会不会重复执行同一个队列任务
    这篇文章主要介绍Laravel会不会重复执行同一个队列任务,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Laravel 是什么Laravel 是一套简洁、优雅的PHP Web开发框架。它可以让你从面条一样杂乱的代码中...
    99+
    2023-06-14
  • java定时任务防止重复执行的方法是什么
    在Java中,可以使用`ScheduledExecutorService`或`Timer`来创建定时任务。如果要防止定时任务重复执行...
    99+
    2023-08-25
    java
  • spring定时任务怎么防止重复调用
    在Spring定时任务中,可以通过以下两种方式来防止重复调用:1. 设置`@Scheduled`注解的`fixedDelay`属性:...
    99+
    2023-10-09
    spring
  • JavaScript中怎么使用generator函数同步执行ajax任务
    JavaScript中怎么使用generator函数同步执行ajax任务,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下functi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作