鍍金池/ 問(wèn)答/Python  網(wǎng)絡(luò)安全/ celery中的兩組group任務(wù),如何讓第二組任務(wù)等待第一組任務(wù)完成后執(zhí)行

celery中的兩組group任務(wù),如何讓第二組任務(wù)等待第一組任務(wù)完成后執(zhí)行

我需要按步驟執(zhí)行兩組任務(wù),每組任務(wù)中的子任務(wù)是并行celery執(zhí)行的,但是第二組任務(wù)需要等待第一組任務(wù)全部完成后再繼續(xù)執(zhí)行

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中的任務(wù)先并發(fā)執(zhí)行,這個(gè)需要調(diào)用celery的groups1.apply_async(),但這樣會(huì)把groups1這個(gè)任務(wù)異步執(zhí)行,我想讓group2等待group1全部執(zhí)行之后再繼續(xù)執(zhí)行?celery中有沒(méi)有什么方法可以做到?

回答
編輯回答
尤禮

首先來(lái)分析下你上面的需求需要幾個(gè)celery服務(wù)
主線(xiàn)程是必須的,所以需要線(xiàn)程main,
因?yàn)間roup2是在group1后執(zhí)行的,所以group1和group2應(yīng)該是同步方法,執(zhí)行在同一線(xiàn)程;又因?yàn)樗麄冃枰獙?duì)主線(xiàn)程異步,所以他們應(yīng)該是執(zhí)行在一個(gè)celery中的。
所以最終的結(jié)構(gòu)應(yīng)該大致如下:

  1. group1 對(duì)應(yīng)于 celery1,并在 celery1 中執(zhí)行
  2. group2 對(duì)應(yīng)于 celery2,并在 celery2 中執(zhí)行
  3. 有一個(gè) celery3, group1 和 group2 應(yīng)該同步執(zhí)行在該celery中,且 group2 應(yīng)該先執(zhí)行
  4. celery3 執(zhí)行于 main線(xiàn)程

大致實(shí)現(xiàn):

@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()
2018年5月7日 09:01