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