Python 在不丢失保留任务的情况下重新加载芹菜代码

Python 在不丢失保留任务的情况下重新加载芹菜代码,python,rabbitmq,celery,django-celery,Python,Rabbitmq,Celery,Django Celery,我在芹菜中保留了数百万个任务(ETA尚未到期),每次我想更新芹菜代码库时,我都必须重新启动它,这会切断与RabbitMQ的连接,并导致RabbitMQ再次分发任务(我使用的是延迟确认) 是否可以重新加载新的代码库,但仍保留保留的任务?我将芹菜与Django一起使用。简短回答:可以,但您必须编写自己的队列排水逻辑 更详细的回答:当你想更新代码时(取决于你如何处理),你必须用芹菜来告诉你所有的员工停止使用任务。RabbitMQ代理支持远程控制api 这将阻止您的工作人员使用任务。现在,您必须监视工作

我在芹菜中保留了数百万个任务(ETA尚未到期),每次我想更新芹菜代码库时,我都必须重新启动它,这会切断与RabbitMQ的连接,并导致RabbitMQ再次分发任务(我使用的是延迟确认)


是否可以重新加载新的代码库,但仍保留保留的任务?我将芹菜与Django一起使用。

简短回答:可以,但您必须编写自己的队列排水逻辑

更详细的回答:当你想更新代码时(取决于你如何处理),你必须用芹菜来告诉你所有的员工停止使用任务。RabbitMQ代理支持远程控制api

这将阻止您的工作人员使用任务。现在,您必须监视工作人员,直到他们完成任何活动任务

import time
done = False
while not done:
    active_count = 0
    active = inspector.active()
    active_count = sum(map(lambda l: len(l), active.values()))
    done = active_count > 0
    if not done:  
        time.sleep(60)  # wait a minute between checks

工作人员完成后,您就可以部署代码,而不必担心任务丢失。

您的意思是说一个工作人员可以保留数百万个任务吗?如果是这种情况,那么队列似乎没有真正被使用。再分配不是这种情况下的预期行为吗?我对你的用例很好奇。
import time
done = False
while not done:
    active_count = 0
    active = inspector.active()
    active_count = sum(map(lambda l: len(l), active.values()))
    done = active_count > 0
    if not done:  
        time.sleep(60)  # wait a minute between checks