我如何同步django芹菜任务?

时间:2018-06-04 05:21:16

标签: django task celery

我有两个芹菜任务

@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 个答案:

答案 0 :(得分:1)

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

  1. 确保task2task1运行时无法启动。您可以通过实现分布式锁来解决此问题,例如: using Redis.
  2. 确保task2task1完成后启动。这可以通过re-trying task2来解决,直到锁定可用。
  3. 这是一些伪代码:

    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完成和等待task1作业开始之间安排了另一个task2作业,会发生什么?