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

 更新时间:2021年10月31日 10:42:58   作者:Step_Top  
这篇文章主要介绍了使用 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 Celery
from celery_once import QueueOnce
from time import sleep

celery = 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

参考链接 https://github.com/cameronmaske/celery-once

到此这篇关于使用 Celery Once 来防止 Celery 重复执行同一个任务的文章就介绍到这了,更多相关 Celery 重复执行同一个任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python程序设计入门(1)基本语法简介

    Python程序设计入门(1)基本语法简介

    Python是当今日趋流行的一种脚本语言,它比Java更简单,比php更强大,并且还适用于做桌面应用的开发,这篇文章主要介绍了Python基本语法,需要的朋友可以参考下
    2014-06-06
  • 在VSCode中搭建Python开发环境并进行调试

    在VSCode中搭建Python开发环境并进行调试

    这篇文章介绍了在VSCode中搭建Python开发环境并进行调试的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Python使用HTTP POST上传WAV文件的方法

    Python使用HTTP POST上传WAV文件的方法

    Python是一个非常流行的编程语言,可以用于开发不同类型的应用程序。其中,上传文件是一个非常常见的需求。具体而言,我们探讨了使用HTTP POST请求上传单个和多个WAV文件的方法。无论你是需要将音频文件上传到云存储还是服务器,这些方法都能帮助你上传文件。
    2023-06-06
  • python加密打包程序详解

    python加密打包程序详解

    这篇文章主要介绍了python加密打包程序,还给大家介绍了Python实现文件简单加解密的方法,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Tensorflow--取tensorf指定列的操作方式

    Tensorflow--取tensorf指定列的操作方式

    这篇文章主要介绍了Tensorflow--取tensorf指定列的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python下载的库包存放路径

    python下载的库包存放路径

    在本篇文章里小编给大家整理的是一篇关于python下载的库包存放路径,需要的朋友们可以参考学习下。
    2020-07-07
  • python爬虫之BeautifulSoup 使用select方法详解

    python爬虫之BeautifulSoup 使用select方法详解

    本篇文章主要介绍了python爬虫之BeautifulSoup 使用select方法详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 跟老齐学Python之Python安装

    跟老齐学Python之Python安装

    本文主要讲诉了在Linux,Windows,MacOS三大系统中如何安装Python环境,非常的实用,虽然前面絮絮叨叨的说了不少题外话,但都是作者的肺腑之言,还是仔细看看吧
    2014-09-09
  • Python利用matplotlib绘制折线图的新手教程

    Python利用matplotlib绘制折线图的新手教程

    这篇文章主要给大家介绍了关于Python利用matplotlib绘制折线图的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • pip安装路径修改的详细方法步骤

    pip安装路径修改的详细方法步骤

    在实际使用安装python的pip安装依赖库是非常的便捷的,下面这篇文章主要给大家介绍了关于pip安装路径修改的详细方法步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论