celery - 芹菜失去工人
问题描述
我在我的项目中使用 celery 4.4.0 版本(Ubuntu 18.04.2 LTS)。当我提出异常('功能中的功能太少无法分类')时,芹菜项目失去了工人,我得到了这样的日志:
[2020-02-11 15:42:07,364] [ERROR] [Main] 任务处理程序引发错误:WorkerLostError('Worker 提前退出:exitcode 0.')
回溯(最近一次通话最后):
文件“/var/lib/virtualenvs/simus_classifier_new/lib/python3.7/site-packages/billiard/pool.py”,第 1267 行,在 mark_as_worker_lost human_status(exitcode)),billiard.exceptions.WorkerLostError: Worker 过早退出:exitcode 0。
[2020-02-11 15:42:07,474] [DEBUG] [ForkPoolWorker-61] 关闭通道 #1
你知道如何解决这个问题吗?
解决方案
WorkerLostError 几乎就像 OutOfMemory 错误 - 它们无法解决。它们将不时发生。您应该做的是使您的任务具有幂等性,并让 Celery 重试由于工人崩溃而失败的任务。
这听起来微不足道,但在许多情况下并非如此。例如,并非所有任务都可以是幂等的。Celery 在处理 WorkerLostError 的方式上仍然存在错误。因此,您需要密切监视您的 Celery 集群并对这些事件做出反应,并尽量减少它们。换句话说,找出工人崩溃的原因——它是否被系统杀死是因为它消耗了所有的内存?它是否仅仅因为它在 AWS Spot 实例上运行而被终止,并且被终止了?它是被执行死刑的人杀死的kill -9 <worker pid>
吗?所有这些情况都可以这样或那样处理......
推荐阅读
- haskell - 过滤后在type1中转换Maybe type1
- c# - 我怎样才能使功能继续运行
- android - 如何提高相机的对焦速度?
- reactjs - 在移动屏幕上反应日期选择器切割日历
- javascript - 将字符串中的最后一个数字设置为负数
- java - 在 <> 中使用对象名称作为新的 ArrayList
是正确的还是可以只使用<>? - networking - 如何从 GCP VM 实例连接到端口 3459 上的外部代理?
- php - 如果产品没有评论,想显示随机评论
- python - 当一个 Series 传递给 Numpy 的 exp() 函数时,为什么会返回一个 Series?
- signalr - .NET Core,SignalR Hub 的构造函数 IHubCallerClients 为 NULL