>我有两张表格要按顺序填写。 第一个是必需的,第二个是可选的。 两者都启动 Celery 任务来处理表单数据,但第二个任务需要第一个任务将写入数据库的数据。
我发现,如果第一个和第二个表单提交得非常快,第二个任务将失败,因为第一个任务尚未完成并保存数据。
如何确保第一个任务中的数据可用于第二个任务? 第二个任务需要由表单提交来安排,因为第二个表单是可选的,因此它不能是第一个任务的回调。
如果数据尚不存在,请在延迟后不断重试第二个任务。 或者使用回调将第二个任务安排在第一个任务之后。 无论哪种方式,你都必须检查你需要的数据是否可用:如果你独立
调度第二个,你需要等待看看第一个数据是否存在,如果你在第一个数据之后调度第二个数据,你需要等待看看第二个数据是否存在。以下内容一直计数到停止值,在重试之间等待五秒钟,然后打印"完成"。 这将模拟重试任务,直到所需的数据可用。 设置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)
在整个
表单填写后安排单个任务会更有意义。 然后,您只需安排一次任务,就可以确保它将拥有完整的数据。 如果用户未填写这两个表单,这也将防止某些数据处于中间状态。