簡體   English   中英

芹菜,一個再見一個隊列,並行許多時間隊列

[英]celery, one bye one queue and parallel many in time queues

我正在嘗試使用芹菜來管理任務。 我現在遇到的問題是,我有許多次要任務(電子郵件,跨服務器帖子等)以及耗時的任務,例如文件上傳。

有什么方法可以指定,上傳將始終是一個接一個的。 只有一個任務及時執行,而其他工作人員會在其他隊列上工作嗎?

序列化任務執行的有效方法是使用互斥鎖(互斥)。

Python的threading模塊具有一個Lock對象 ,可用於實現此目的

# ...
module_lock = threading.Lock() # or make this an attribute in an object with sufficiently-large scope
# ...
def do_interesting_task():
     with module_lock.acquire():
         interesting_task()

“放棄所有希望,你們進入這里的人。”

互斥體和信號量是強大的工具,但如果使用不當,則會產生僵局,並偶爾吃午餐。

同時,我已經實現了這樣的解決方案,效果很好。 但是,我不太確定,tha max_retries =沒有狀態說明重試次數不受限制。 該解決方案適用於redis,但可以用於支持增量原子操作的任何其他引擎。

@task(max_retries=None,default_retry_delay=3)
def sleepTask():
    if r.incr('sleep_working')>1:
        r.incr('sleep_working',-1)
        sleepTask.retry()
    else:
        try:
            r.expire('sleep_working',3600)
            sleep(30)
        finally:
            r.incr('sleep_working',-1)
        return True

這里的關鍵是incr是原子的,因此永遠不會發生,兩個客戶端收到counter == 1。

到期非常重要,任何事情都可能發生,並且我們將永遠使計數器> 1,因此到期確保了在特定時間計數器被刪除后無論如何。 該值可以根據需要進行調整。 我的是大文件上傳,所以3600聽起來還可以。

我認為這是制作自定義Task對象的良好起點,它將通過接收redis_key和expire_time值自動完成所有這些任務。 如果我要做這樣的任務,我將更新這篇文章。

另外,通過將> 1更改為> anynumber,也可以輕松地將此解決方案調整為2/3 /任何其他並行限制數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM