亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用 Celery Once 來防止 Celery 重復執(zhí)行同一個任務

 更新時間:2021年10月31日 10:42:58   作者:Step_Top  
這篇文章主要介紹了使用 Celery Once 來防止 Celery 重復執(zhí)行同一個任務,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在使用 Celery 的時候發(fā)現(xiàn)有的時候 Celery 會將同一個任務執(zhí)行兩遍,我遇到的情況是相同的任務在不同的 worker 中被分別執(zhí)行,并且時間只相差幾毫秒。這問題我一直以為是自己哪里處理的邏輯有問題,后來發(fā)現(xiàn)其他人 也有類似的問題,然后基本上出問題的都是使用 Redis 作為 Broker 的,而我這邊一方面不想將 Redis 替換掉,就只能在 task 執(zhí)行的時候加分布式鎖了。

不過在 Celery 的 issue 中搜索了一下,有人使用 Redis 實現(xiàn)了分布式鎖,然后也有人使用了 Celery Once。 大致看了一下 Celery Once ,發(fā)現(xiàn)非常符合現(xiàn)在的情況,就用了下。

Celery Once 也是利用 Redis 加鎖來實現(xiàn), Celery Once 在 Task 類基礎上實現(xiàn)了 QueueOnce 類,該類提供了任務去重的功能,所以在使用時,我們自己實現(xiàn)的方法需要將 QueueOnce 設置為 base

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

后面的 once 參數(shù)表示,在遇到重復方法時的處理方式,默認 graceful 為 False,那樣 Celery 會拋出 AlreadyQueued 異常,手動設置為 True,則靜默處理。

另外如果要手動設置任務的 key,可以指定 keys 參數(shù)

@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 參數(shù)

@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 重復執(zhí)行同一個任務的文章就介紹到這了,更多相關 Celery 重復執(zhí)行同一個任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論