首页 文章

我如何同步django芹菜任务?

提问于
浏览
0

我有两个芹菜任务

@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,我想在task1完成后运行task2

我怎么能解决这个问题?

我也在考虑为每个用户分配一个队列

请给我一个完美的解决方案......

1 回答

  • 1

    您的问题包含两个子问题:

    • 确保 task1task1 运行时未启动 . 您可以通过实现分布式锁来解决此问题,例如: using Redis.

    • 确保 task2task1 完成后启动 . 这可以通过re-trying 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 作业,会发生什么?

相关问题