>我有两个芹菜任务
@app.task(bind=True)
def task1():
@app.task(bind=True)
def task2():
每个任务都由不同的 API 调用,如下所示
@api_view(['POST'])
@permission_classes((IsAuthenticated,))
def api1(request):
task_1.delay()
@api_view(['POST'])
@permission_classes((IsAuthenticated,))
def api2(request):
task_2.delay()
如果在 Task1 在后台运行时调用 task2, 我想在任务 1 完成后运行任务 2
我该如何解决问题?
我还在考虑为每个用户提供一个队列
请给我一个完美的解决方案...
您的问题由两个子问题组成:
- 确保
task2
在运行时不会启动task1
。您可以通过实现分布式锁来解决此问题,例如使用 Redis。 - 确保
task2
在完成后task1
开始。这可以通过重试task2
直到锁可用来解决。
下面是一些伪代码:
def task1():
with distributed_lock():
# do actual task
def task2():
while not is_lock_available():
self.retry()
# do actual task
有几个细节需要考虑:
- 如果在
task1
已在运行时触发task1
会发生什么情况? - 如果在
task2
已经在运行时触发task2
会发生什么情况? - 在等待
task2
作业开始之前,什么样的延迟是可以接受的? - 如果在完成
task1
和等待task2
作业启动之间安排了另一个task1
作业,会发生什么情况?