美文网首页
Celery 重复执行同一个任务错误的解决

Celery 重复执行同一个任务错误的解决

作者: _Cappuccino_ | 来源:发表于2019-05-13 09:25 被阅读0次

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

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

Celery Once 也是利用 Redis 加锁来实现,他的使用非常简单,参照 GitHub 的使用很快就能够用上。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

http://einverne.github.io/post/2018/01/use-celery-once-to-prevent-multiple-execution.html

相关文章

  • Celery 重复执行同一个任务错误的解决

    在使用 Celery 的时候发现有的时候 Celery 会将同一个任务执行两遍,我遇到的情况是相同的任务在不同的 ...

  • 通过celery_one避免Celery定时任务重复执行

    通过celery_one避免Celery定时任务重复执行 在使用Celery统计每日访问数量的时候,发现一个任务会...

  • 【celery】任务重复执行

    问题 celery定时任务里面启用延时任务,出现延时任务重复执行的问题。如:定时任务: project_statu...

  • celery windows ValueError: not e

    windows下的celery在执行任务时报如下错: 解决办法,在启动celery时加上参数--pool=solo,即

  • python之Celery介绍

    一、Celery介绍 1. Celery是什么 Celery是一个强大的分布式任务队列,它可以让任务的执行完全脱离...

  • 2018-07-04(Celery)

    Celery(异步任务队列) 1、Celery三个概念 1)任务发出者:任务发出者就是发出要执行任务的函数; 2)...

  • django celery redis

    # celery redis celery 执行异步 定时 任务等的工作 架构: 1. broker : 前端接收...

  • django celery运行报错 TypeError: can

    django执行celery操作时,报错如下: 还有同类型的错误 都可以试试这个解决方法:找到python安装库的...

  • celery

    Django配置Celery执行异步任务和定时任务 celery是一个基于python开发的简单、灵活且可靠的分布...

  • 2019-08-08

    Django配置Celery执行异步任务和定时任务 celery是一个基于python开发的简单、灵活且可靠的分布...

网友评论

      本文标题:Celery 重复执行同一个任务错误的解决

      本文链接:https://www.haomeiwen.com/subject/sbikaqtx.html