2016-01-20 87 views
0

我沒有從celery documentation得到什麼芹菜部分的確切主意。我可能想使用它,但不知道我的想法是否正確。芹菜部分是什麼?

讓我們說,我有以下兩個任務:

  • add(a, b, c)
  • multiply(d, e)

假設這兩個任務需要更長的時間才能完成。是否可以使用諧音來:

  1. 運行add(?, b, c)平行multiply(d, e)
  2. 合格multiply(d, e)結果作爲最後一個參數來add()

這種方式增加bcd乘法和並行e運行,當兩者都做,只是乘法運算的結果傳遞給add任務。這可以節省一些時間,因爲bc總和已經計算出來,並且在第二步中只有a被添加到預先計算的結果中?

如果是這樣,我該如何做到這一點?我的意思是在add任務中等待a參數的提供方法是什麼?我試過了,但沒有在該主題上找到任何相關文檔...

回答

1

不,您對芹菜偏分量如何工作有不正確的想法。

只有指定了所有參數後,才能執行它們。

如果你這樣做了以下

ch = chain(multiply.s(d, e), add.s(b, c)) 
ch.apply_async() 

發生的事情是multiply是異步運行。一旦完成,結果將被傳遞到add,然後異步運行。

爲了實現你說的,你的並行化可以使用下列內容:

@app.task 
def add(a, b): 
    return a + b 

ch = chord(group(multiply.s(d, e), add.s(b, c)))(add.s()) 
+0

好吧,這有點遺憾,但感謝你的澄清! –

+1

已更新答案以顯示您正在尋找的方法 – scytale