在Celery中从子任务访问父任务的参数
有没有办法让子任务 Z 访问父任务 A 被调用时传入的参数?换句话说,当任务 Z 在一系列任务中被调用时,它能否以某种方式访问任务 A 被触发时的一个参数 V,而这个参数并没有通过任务 A 和 Z 之间的任何中间节点传递?如果可以的话,应该怎么做呢?
这里使用的是 Celery 3.0 和 RabbitMQ 作为结果后端。
2 个回答
我觉得你可以做到,至少在 chord
里。当你把任务设置为 bind=True
时,你可以访问 self.request
。在 self.request.chord
中,你会找到一个详细的字典。在它的 kwargs
或者 options['chord']
中,你会找到你想要的东西,不过这不是一个很优雅的解决方案。而且,如果父任务被替换了,你只能看到最终的状态。
我暂时给自己的问题一个“没有”的回答,希望有比我更懂行的人能提供解决方案。
在仔细查看了Celery的文档后,我觉得似乎没有办法获取父任务被调用时的参数。根据文档的说法:
在任务的生命周期中,它会经历几个可能的状态,每个状态可能会附带一些额外的信息。当任务进入一个新状态时,之前的状态就会被遗忘。
任务可以处于以下几种状态:待处理、开始、成功、失败、重试和撤销。对于我的情况来说,关键似乎是成功状态。我想做的是,对于一个成功的任务,找到它的(一个)父任务的ID,然后查看父任务被调用时的参数。然而,根据文档,处于成功状态的任务不会包含这种数据(因为父任务本身已经成功执行,并且生成了子任务):
成功:任务已成功执行。
元数据:结果包含任务的返回值。传播:是的,准备好:是的
换句话说,这里似乎有一个硬性限制。即使我能找到我感兴趣的父任务的ID,由于它已经成功执行,根据定义,我将无法访问它被调用时的参数,因为它只包含返回值(不再包含参数)。