在工作进程关闭期间通知celery任务停止

4
我正在使用celery 3.X和RabbitMQ后端。不时需要重新启动celery(将新的源代码更新推送到服务器)。但是有一个具有大循环和try / catch内部的任务; 它可能需要几个小时才能完成任务。如果我停止它并稍后重新启动它,不会发生任何严重问题。
问题:问题是每次我停止工作进程(通过sudo service celeryd stop),我必须手动KILL该任务(通过kill -9); 该任务忽略来自worker的SIGTERM。 我已经阅读了Celery文档和Stackoverflow,但找不到解决问题的方法。 有什么想法可以解决这个问题吗?

请查看此链接:https://dev59.com/rF3Ua4cB1Zd3GeqP-0FB?rq=1 - Venkatesh Bachu
1
@venkatesh-bachu 我看到了这个,但是这是一个不同的情况。那篇文章是关于如何在任务完成后进行清理。我的问题是,当我停止工作线程时,如何停止/终止任务中的长时间(可以认为是无限循环)循环。 - Roman Podlinov
使用以下命令可以一次性终止所有进程:ps auxww | grep 'celeryd' | awk '{print $2}' | xargs kill -9。如果你想在fab中使用此命令,否则你可以在将代码推送到机器后重新启动机器。 - Venkatesh Bachu
@venkatesh-bachu 是的,我使用它,但更像是一种“hack”。我想找到我的问题的永久解决方案 :) - Roman Podlinov
每次代码部署后,我都会进行服务器重启。 - Venkatesh Bachu
3
@VenkateshBachu 这并不是适用于具备自动扩展能力的分布式环境的解决方案。重新启动很少是真正的解决方法。 - jweyrich
2个回答

0
发送QUIT信号将会立即停止工作进程sudo service celeryd stop -QUIT 如果CELERY_ACKS_LATE设置为True,则在工作进程重新启动时,之前正在运行的任务将会再次运行。

那是一个已知的错误,希望在Celery 4.0.3中得到修复。发生的情况是,即使任务已经完成,但它们没有确认(当acks_late为True时)... - DejanLekic

-1

Celery不适合运行长时间的任务,因为它会阻塞工作进程只为您的任务服务。我建议重新安排您的逻辑,使任务调用自身而不是进行循环。一旦关闭正在进行中,您当前的任务将完成,并将在Celery关闭之前停止的同一点恢复。

此外,将任务拆分成块,您将能够将任务转移到另一个工作进程/主机,这可能是您未来想要做的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接