我正在尝试检索存储在mysql结果后端的芹菜中所有链接任务的结果。
例如,我有以下两个芹菜任务,
@celery.task(name='celery_fl.add')
def add(x, y, value=None):
if value is None:
try:
return x + y
except TypeError:
return None
return value
@celery.task(name='celery_fl.mul')
def mul(x, y, value=None):
if value is None:
try:
return x * y
except TypeError:
return None
return value
以下是我如何链接它们,
parent = (add.s(2, 2) | mul.s(8)).apply_async()
这里parent.get()的输出将是最终链接任务的结果。 parent.parent.get()将为我提供第一个链式任务的输出。
我想要实现的是,我希望在后一阶段使用任务ID获得相同的输出。
task_id = 'bc5fc4b1-613e-4ef0-b5c8-900999d9a6f1'
parent = AsyncResult(task_id, app=celery)
说我的task_id属于链式事件(父级)中的第二个任务。如果我输入parent.parent.get(),那么我应该得到第一个链接任务的结果。但不知怎的,我得到的是无价值。还有另一种方法我应该使用task_id来代替AsyncResult()吗?
答案 0 :(得分:0)
当使用mysql后端存储结果时,每个链接任务的结果将分别存储。但是任务实例不再可用,没有它,就无法使用主任务来检索子任务的结果(Ref-Celery tasks)。
因此,为了检索所有任务的结果,每个任务的任务ID应该存储在数据库中的某个位置。
使用flask(python)的示例,
chain = (s3_init.s(order.name, order.id)|create_order_sheet.s(order.id, order.name) | create_order_info.s(order.id, order.name))
res = chain()
process = {
's3_init': res.parent.parent.parent.parent.parent.parent.id,
'order_sheet': res.parent.parent.parent.parent.id,
'order_info': res.parent.parent.parent.id
}
order.update(process_id=json.dumps(process))
然后,您可以简单地从数据库中获取任务ID,并使用celery.result.AsyncResult(task_id)按ID检索每个任务(参考-Async results)。