[英]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.