使用 Celery Once 來(lái)防止 Celery 重復(fù)執(zhí)行同一個(gè)任務(wù)
在使用 Celery 的時(shí)候發(fā)現(xiàn)有的時(shí)候 Celery 會(huì)將同一個(gè)任務(wù)執(zhí)行兩遍,我遇到的情況是相同的任務(wù)在不同的 worker 中被分別執(zhí)行,并且時(shí)間只相差幾毫秒。這問(wèn)題我一直以為是自己哪里處理的邏輯有問(wèn)題,后來(lái)發(fā)現(xiàn)其他人 也有類似的問(wèn)題,然后基本上出問(wèn)題的都是使用 Redis 作為 Broker 的,而我這邊一方面不想將 Redis 替換掉,就只能在 task 執(zhí)行的時(shí)候加分布式鎖了。
不過(guò)在 Celery 的 issue 中搜索了一下,有人使用 Redis 實(shí)現(xiàn)了分布式鎖,然后也有人使用了 Celery Once。 大致看了一下 Celery Once ,發(fā)現(xiàn)非常符合現(xiàn)在的情況,就用了下。
Celery Once 也是利用 Redis 加鎖來(lái)實(shí)現(xiàn), Celery Once 在 Task 類基礎(chǔ)上實(shí)現(xiàn)了 QueueOnce 類,該類提供了任務(wù)去重的功能,所以在使用時(shí),我們自己實(shí)現(xiàn)的方法需要將 QueueOnce 設(shè)置為 base
@task(base=QueueOnce, once={'graceful': True})
后面的 once 參數(shù)表示,在遇到重復(fù)方法時(shí)的處理方式,默認(rèn) graceful 為 False,那樣 Celery 會(huì)拋出 AlreadyQueued 異常,手動(dòng)設(shè)置為 True,則靜默處理。
另外如果要手動(dòng)設(shè)置任務(wù)的 key,可以指定 keys 參數(shù)
@celery.task(base=QueueOnce, once={'keys': ['a']})
def slow_add(a, b):
sleep(30)
return a + b
總得來(lái)說(shuō),分為幾步
第一步,安裝
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
到此這篇關(guān)于使用 Celery Once 來(lái)防止 Celery 重復(fù)執(zhí)行同一個(gè)任務(wù)的文章就介紹到這了,更多相關(guān) Celery 重復(fù)執(zhí)行同一個(gè)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python利用遞歸方法實(shí)現(xiàn)求集合的冪集
這篇文章主要給大家介紹了關(guān)于python利用遞歸方法實(shí)現(xiàn)求集合的冪集的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python基礎(chǔ)學(xué)習(xí)之模塊的安裝和卸載
其實(shí)現(xiàn)在還是有很多剛開(kāi)始學(xué)習(xí)的小伙伴,會(huì)遇到模塊不會(huì)安裝的情況,或者一遇到報(bào)錯(cuò)就懵了,這樣就很耽誤我們的學(xué)習(xí)進(jìn)度。所以,今天我們就來(lái)了解一下Python幾種安裝模塊的方法吧2022-09-09
對(duì)Python中一維向量和一維向量轉(zhuǎn)置相乘的方法詳解
今天小編就為大家分享一篇對(duì)Python中一維向量和一維向量轉(zhuǎn)置相乘的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python讀取excel數(shù)據(jù)并且畫圖的實(shí)現(xiàn)示例
這篇文章主要介紹了python讀取excel數(shù)據(jù)并且畫圖的實(shí)現(xiàn)示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02
python計(jì)算鄰接矩陣的實(shí)現(xiàn)示例
鄰接矩陣是一種常見(jiàn)的圖表示方法,本文主要介紹了python計(jì)算鄰接矩陣的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11
pygame實(shí)現(xiàn)俄羅斯方塊游戲(基礎(chǔ)篇3)
這篇文章主要介紹了pygame實(shí)現(xiàn)俄羅斯方塊游戲基礎(chǔ)的第3篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
python自動(dòng)化操作之動(dòng)態(tài)驗(yàn)證碼、滑動(dòng)驗(yàn)證碼的降噪和識(shí)別
很多網(wǎng)站登錄都需要輸入驗(yàn)證碼,如果要實(shí)現(xiàn)自動(dòng)登錄就不可避免的要識(shí)別驗(yàn)證碼,下面這篇文章主要給大家介紹了關(guān)于python自動(dòng)化操作之動(dòng)態(tài)驗(yàn)證碼、滑動(dòng)驗(yàn)證碼的降噪和識(shí)別,需要的朋友可以參考下2021-08-08

