簡體   English   中英

隊列中特定任務的芹菜限制數

[英]Celery limit number of specific task in queue

我正在使用Celery 3.1.x執行2個任務。 當Celery通過celeryd_after_setup信號啟動時,第一個任務(TaskOne)入隊:

@celeryd_after_setup.connect
def celeryd_after_setup(*args, **kwargs):
    TaskOne().apply_async(countdown=5)

運行TaskOne時,它將進行一些計算,然后使TaskTwo入隊。 想象以下工作流程:

  • 我開始芹菜,因此信號被發射並且TaskOne被排隊
  • 倒數計時(5)在TaskTwo入隊后
  • 然后我停止芹菜(TaskTwo仍然在隊列中)
  • 之后我重啟芹菜
  • 工作流再次運行,TaskTwo再次入隊

因此,隊列中有2個TaskTwo。 這對我的工作流程來說是個問題,因為我只希望一個TaskTwo在隊列中,並避免第二個被排隊。

我的問題:我該如何實現?

使用celery.app.control.Inspect.scheduled()Docs ),我可以獲取已計划的任務列表,並隱藏在列表和字典的組合中。 這也許是一種方法,但是經歷這種結果並不正確。 有什么更好的辦法嗎?

一個易於實現的解決方案是將--purge開關添加到worker命令中。 它將清除隊列,並且工作程序從沒有計划的作業開始。

但是請注意:這是一種作業全局性的,不可恢復的動作。 如果您要依靠其他預定的作業,那不是您的解決方案。

考慮了幾個選項后,我選擇使用app.control.inspect 這不是一個非常漂亮的解決方案,但是它可以工作:

# fetch all scheduled tasks
scheduled_tasks = inspect().scheduled()

# iterate the scheduled task values, see http://docs.celeryproject.org/en/latest/userguide/workers.html?highlight=revoke#dump-of-scheduled-eta-tasks
for task_values in iter(scheduled_tasks.values()):
    # task_values is a list of dicts
    for task in task_values:
        if task['request']['name'] == '{}.{}'.format(TaskTwo.__module__, TaskTwo.__name__):
            logger.info('TaskTwo is already scheduled, skipping additional run')
                return

暫無
暫無

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

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