芹菜嵌套和弦未按正确顺序调用回调

时间:2018-06-25 20:49:45

标签: python celery django-celery

我试图调用一个创建和弦的方法,并将该和弦用于在另一个方法中构建的另一个和弦中。但是我无法让它以正确的顺序调用回调。

#celery obj
app = Celery('tasks', backend=BACKEND, broker=BROKER)

这是我用来测试的简单方法:

@app.task
def first_task(args):
    return 'first_task'


@app.task
def first_body(args):
    return 'first_body'


@app.task
def second_body(args):
    return 'second_body'


@app.task
def third_body(args):
    return 'third_body'

这是我创建和弦的方式:

@app.task
def simple_chord(args):
    c = chord(group([first_task.s(args)]), body=first_body.s())
    return c()

# this works as expected 
# first_task -> first_body -> second_body -> third_body
def test_chords():
    c = chord(group([chord(group([chord(group([first_task.s('foo')]),
                                        body=first_body.s())]),
                           body=second_body.s())]),
              body=third_body.s())

    c.delay()

# this does not work as expected
# first_task -> second_body -> first_body -> third_body
def test_chords_2():
    c = chord(group([chord(group([simple_chord.s('foo')]),
                           body=second_body.s())]),
              body=third_body.s())

    c.delay()

当我像test_chords那样在一个位置上建立和弦时,它会执行我期望的操作(first_task-> first_body-> second_body-> third_body)。但是,我希望能够获得在simple_chord方法中构建的和弦,并像在test_chords_2中那样在另一个和弦中使用它,但是它不等待first_body被执行,然后再执行{ {1}}。而是按以下顺序执行:first_task-> second_body-> first_body-> third_body

我在工作人员控制台中看到的内容:

second_body

我的问题是做这样的事情的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

通过在simple_chord中正常调用test_chords_2来解决此问题(不是作为签名)。我使它不必要地异步运行:

def test_chords_2():
c = chord(group([chord(group([simple_chord('foo')]),
                       body=second_body.s())]),
          body=third_body.s())

print(c)
c.delay()