【发布时间】:2020-02-19 06:13:23
【问题描述】:
我有一个由链中的子任务组成的任务。如何确保在第一个任务完成之前不会开始第二次调用此任务?
@shared_task
def task(user):
res = chain(subtask_1.s(), # each subtask takes ~1 hour
subtask_2.s(),
subtask_3.s())
return res.apply_async()
django 视图现在可能会触发调用此任务:
# user A visits page that triggers task
task.delay(userA)
# 10 seconds later, while task() is still executing, user B visits page
task.delay(userB)
这会导致任务相互竞争,而不是按顺序执行。例如。一旦工作人员完成了第一个任务的subtask_1(),它就会开始处理第二个任务的subtask_1(),而不是第一个任务的subtask_2() 和subtask_3()。
有没有办法优雅地避免这种情况?我想问题是子任务添加到队列中的顺序。
- 我已经设置了worker
--concurreny=1,但是这仍然不会改变他从队列中消费的顺序。 - Official docs (task cookbook) 似乎提供了一个我不理解的解决方案,不幸的是对我不起作用。
- 也许在任务链之后包含一个阻塞机制,带有
while not res.ready(): sleep(1)类型的hack?
【问题讨论】:
标签: python django celery django-celery