celery中的两组group任务,如何让第二组任务等待第一组任务完成后执行

我需要按步骤执行两组任务,每组任务中的子任务是并行celery执行的,但是第二组任务需要等待第一组任务全部完成后再继续执行

from celery import group
from tasks import add

group1 = group([add.s(2, 2), add.s(4, 4),])
group2 = group([add.s(2, 2), add.s(4, 4),])

希望让groups1中的任务先并发执行,这个需要调用celery的groups1.apply_async(),但这样会把groups1这个任务异步执行,我想让group2等待group1全部执行之后再继续执行?celery中有没有什么方法可以做到?

阅读 7.3k
1 个回答

首先来分析下你上面的需求需要几个celery服务
主线程是必须的,所以需要线程main,
因为group2是在group1后执行的,所以group1和group2应该是同步方法,执行在同一线程;又因为他们需要对主线程异步,所以他们应该是执行在一个celery中的。
所以最终的结构应该大致如下:

  1. group1 对应于 celery1,并在 celery1 中执行
  2. group2 对应于 celery2,并在 celery2 中执行
  3. 有一个 celery3, group1 和 group2 应该同步执行在该celery中,且 group2 应该先执行
  4. celery3 执行于 main线程

大致实现:

@app.task()
def group1():
    return group([add.s(2, 2), add.s(4, 4),])
    
@app.task()
def group2():
    return group([add.s(2, 2), add.s(4, 4),])

@app.task()
def celery3():
    result = group1.delay()
    # sync group1
    result.collect()
    group2.delay()

# main thread
celery3.delay()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题