python - 芹菜:损坏的状态有效载荷。可能的原因?装饰__call__()方法的原因?
问题描述
我正在尝试诊断这一点,但想把问题抛在脑后,以防有人看到这样的事情。
基本上我看到的是 AsyncResult(task_id),返回一个状态为 None 的结果。
令人毛骨悚然。
我正在使用 rpc: 后端。
所以我深入研究了 Celery 代码和 RabbitMQ 队列,从两个角度我都可以看到状态消息如下所示:
dict: {'task_id': 'STARTED', 'status': None, 'result': {'pid': 24113}, 'traceback': None, 'children': []}
明显腐败。STARTED 应该处于状态。
我什至对造成这种情况的原因有一些线索,我只需要证明它并找到证据,以及如何解决它。至少可以说很费力,所以我很乐意a)提供任何经验来加速它,b)如果我确实解决了它,为了后代把它记录下来(以防其他人遇到这个) .
这可能(也许)与我装饰任务有关。调用()方法。但我一直在想怎么做。
一个洞察力的宝石将是 Celery 中的状态消息在哪里发送到支持的 RPC 队列?它似乎编译错误。到目前为止,我已经跟踪到将任务启动事件发送到 celerev 交换(对于我想象的事件),并且可能是这个事件触发了要发送的状态更新。
我会继续钻研。但是当我睡觉时,也许其他人有线索?
解决方案
呵呵,发现问题了。并且不确定这何时进入代码库!
我花了很多时间跟踪代码来发现这一点,最终几乎令人尴尬,而且完全是盲目的人为错误。中断的代码是:
self.update_state(state, meta=meta)
有效的是:
self.update_state(state=state, meta=meta)
这仅仅是因为 Task.update_state() 有这个签名:
def update_state(self, task_id=None, state=None, meta=None, **kwargs):
即我们,task_id 我们默认。在某些时候,由于某种原因,工作代码被改变了。嗯,关于如何以及何时不清楚的故事唉(提交之间相当重要的重构的一部分)。
令人沮丧的是,回想起来这是我应该看的第一个地方。我认为我失败的原因是第一次 Celery 状态更新(标准 Celery 状态更新(STARTED)已损坏,并且不是由我修复的上述行生成的。对我来说很神秘。
推荐阅读
- excel - 使用 Excel 创建报告模板,然后从另一个工作表填充特定数据点,以 .pdf 格式输出
- amazon-web-services - AWS WAF 日志利用率 + Web 应用程序的渗透测试
- azure-data-factory - Azure DataFactory 查找活动“结束时间 UTC”使用情况
- apache-flink - Flink 在单个作业中执行语句集和数据流
- moodle - 如何从 Moodle 发送会话 ID 参数?
- amazon-web-services - 使用自定义行分隔符创建 redshift 表处理 .json 文件
- python - 每小时使用批处理文件重新加载 python 脚本
- shell - 如何在我的活动目录中更改 adobe 的设置?
- composer-php - 安装时覆盖 composer 包类型
- modelica - Error using the library Modelica_LinearSystems2 in OpenModelica