我试图调用一个创建和弦的方法,并将该和弦用于在另一个方法中构建的另一个和弦中。但是我无法让它以正确的顺序调用回调。
#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
我的问题是做这样的事情的最佳方法是什么?
答案 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()