簡體   English   中英

如何按名稱限制運行Celery任務的最大數量

[英]How to limit the maximum number of running Celery tasks by name

如何限制可以同時運行的特定Celery任務的實例數?

我有一個處理大文件的任務。 我遇到了一個問題,用戶可能會啟動多個任務,導致服務器在嘗試一次處理太多文件時耗盡CPU和內存。 我想確保在任何給定時間只運行這一類任務的N個實例,並且其他任務將在調度程序中排隊等待,直到其他任務完成。

我看到任務裝飾器中有一個rate_limit選項,但我認為這不符合我的要求。 如果我正確理解文檔,這將限制任務的啟動速度,但不會限制運行任務的總數,因此這會使我的服務器崩潰得更慢......但它仍然會盡管如此。

您可以做的是將這些任務推送到特定隊列,並讓X個工作人員處理它們。 在具有100個項目的隊列中具有兩個工作人員將確保將僅同時處理兩個任務。

您必須設置額外的隊列並為其設置所需的並發級別。 來自路由任務

# Old config style    
CELERY_ROUTES = {
                'app.tasks.limited_task': {'queue': 'limited_queue'}
            } 

要么

from kombu import Exchange, Queue
celery.conf.task_queues = (
        Queue('default', default_exchange, routing_key='default'),
        Queue('limited_queue', default_exchange, routing_key='limited_queue')
    ) 

並啟動額外的工作人員,僅服務於limited_queue:

$ celery -A celery_app worker -Q limited_queue --loglevel=info -c 1 -n limited_queue

然后,您可以使用Flower或inspect命令檢查所有運行順利:

$ celery -A celery_app worker inspect --help

我不確定您是否可以在Celery中執行此操作,您可以做的是檢查當請求到達時該名稱當前正在運行的任務數量,如果超過最大值,則返回錯誤或添加定期檢查是否存在的機制為任務打開插槽並運行它(如果添加這樣的機制,則不需要仔細檢查,只需在每個請求中將其添加到其隊列中。

要檢查正在運行的任務,可以使用inspect命令。

簡而言之:

app = Celery(...)
i = app.control.inspect()
i.active()

暫無
暫無

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

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