2013-04-30 67 views
1

我正在尋找一些建議,以將從任務生成的列表映射到芹菜中的另一個任務的最佳方式。將生成的列表映射到芹菜中的任務的最佳方法

比方說,我有一個任務parse,它解析PDF文檔並輸出頁面列表。然後每個頁面都需要單獨傳遞給另一個稱爲feed的任務。這一切都需要去一個任務中調用process

所以,一個辦法,我能做到這一點是這樣的:

@celery.task 
def process: 
    pages = parse.s(path_to_pdf).get() 

    feed.map(pages) 

當然,這不是一個好主意,因爲我打電話get()任務內。

此外,這是效率低下,因爲我的parse任務環繞一個生成器函數,並能夠產生頁面,這意味着應該有可能排隊的第一頁供應之前,最後一頁已由解析器

另一種可能性是要做到這一點:

@celery.task 
def process: 
    for page in parse.s(path_to_pdf).get(): 
     feed.delay(page) 

這個例子還需要調用get()任務裏面雖然。此外,這個例子是過分簡單化的,我確實需要在所有頁面都被輸入後做一些事情(例如在chord)。

我正在尋找在芹菜中做到這一點的最佳方法。我將不勝感激任何建議。

謝謝!

回答

2

這可能是爲時已晚要使用你的,但你可能想使用一個任務鏈:

@celery.task 
def process(): 
    return chain(parse.s(), feed_map.s()) 

@celery.task 
def feed_map(pages): 
    return feed.map(pages) 

如果你有一些最後的任務,說final,你可以這樣做:

@celery.task 
def feed_map(pages): 
    return chord(feed.map.s(page) for page in pages, final.s) 
+0

其實,這就是我最終做到這一點的方式,至今仍在使用。提供一個好的答案永遠不會太晚,希望能幫助其他人。謝謝。 – chaimp 2015-10-13 18:53:52

+0

乾杯@chaimp,我剛剛遇到它,同時尋找一個不同的問題的答案,最近我只能自己解決這個問題;) – theheadofabroom 2015-11-04 10:13:47