簡體   English   中英

使用倒數計時,celery任務未出現在task.apply_async之后的隊列中

[英]Celery task does not appear in queue after task.apply_async using countdown

我希望這個問題符合堆棧溢出的條件。

使用celery 4.2.0和Redis作為代理和后端。

有任務

@shared_task()
def add(a, b):
    return a+b

工作人員處於活動狀態時 ,運行休閑命令:

add.apply_async(countdown=60)

結果任務未注冊到默認芹菜隊列,但在倒計時中指定的時間段后仍執行

為什么會這樣,我如何查找所有待處理的任務? 如果將任務注冊到隊列,則這樣做會起作用:

    with celery_app.pool.acquire(block=True) as conn:
        tasks = conn.default_channel.client.lrange('celery', 0, -1)

如果在任務尚未開始時終止工作器,則會得到休假:

[WARNING/MainProcess] Restoring 1 unacknowledged message(s)

這告訴我任務被保留在隊列之外的其他位置,但是我無法弄清楚在哪里

事實證明,這實際上是預期的行為,因為工作人員甚至在執行之前就抓住未完成的任務以加快處理速度,從而將其從隊列中刪除。

為了實現我想要的目標,即禁止工作人員從隊列中開始實際執行任務之前就開始執行任務,並且無法跟蹤該任務,我不得不一起使用2個芹菜設置

task_acks_late = True
worker_prefetch_multiplier = 1

這樣,任務便從其原始隊列中刪除,但仍存在於稱為“未確認”的隊列中,這使我可以對其進行監視。 優化芹菜

請注意,使用“ acks_late” acks Late設置會帶來一些副作用,您需要注意這些副作用,例如,如果工作進程意外終止,則將還原任務,並在下一次恢復該工作進程時重新運行。

暫無
暫無

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

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