在第二个独立计划的任务中等待来自一个任务的数据

时间:2016-01-19 23:26:04

标签: python flask celery

我有两种表格可以按顺序填写。第一个是必需的,第二个是可选的。两者都启动Celery任务来处理表单数据,但第二个任务需要第一个任务将写入数据库的数据。

我发现如果第一个和第二个表单提交得很快,第二个任务就会失败,因为第一个任务还没有完成并保存了数据。

如何确保第一项任务的数据可用于第二项任务?第二个任务需要由表单提交安排,因为第二个表单是可选的,因此它不能成为第一个任务的回调。

1 个答案:

答案 0 :(得分:0)

如果数据尚未存在,请在延迟后不断重试第二项任务。或者使用回调在第一个任务之后安排第二个任务。无论哪种方式,您都必须检查您所需的数据是否可用:如果您单独安排第二个数据,则需要等待第一个数据是否存在,如果您在第一个数据之后安排第二个数据需要等待看看第二个数据是否存在。

以下计数直至停止值,在重试之间等待五秒钟,然后打印“完成”。这模拟重试任务,直到您想要的数据可用。如果第一个任务失败并且未设置所需数据,则设置max_retries会更安全。 bind=True将任务对象作为函数的第一个参数传递。

@celery.task(bind=True, max_retries=None)
def count_until(self, stop, current=0):
    print(current)

    if current < stop:
        raise self.retry(args=(stop, current + 1), countdown=5)

    print('done')
count_until.delay(5)

在填写整个表单后安排单个任务会更有意义。然后,您只需要安排一次任务,并确保它将具有完整数据。如果用户没有完成两种表单,这也会阻止某些数据处于中间状态。