python - celery工作流的問題
問題描述
celery中,我做這樣的處理:一個url經(jīng)過a, b, c三個的函數(shù),分別獲得返回值,其中任意函數(shù)結(jié)果均與任意其他函數(shù)結(jié)果不相關(guān),然后匯總起來,交給之后的流程.這樣,我自然想到并行運行三個函數(shù)來加快處理速度.然而由于一開始的設(shè)計問題, a函數(shù)式被設(shè)計成了一次可以處理多個url的形式,而一個一個的處理會非常慢.
@celery.taskdef a(url_list): ’...do something...’ for url in url_list:b.delay(url)
我嘗試這樣控制,然而任務(wù)似乎并不能嵌套.那么,如何設(shè)計可以比較好的滿足我這種比較奇怪的流程和要求呢?
問題解答
回答1:應(yīng)該把a(bǔ);b;c拆開,寫成3個task, 同時數(shù)據(jù)庫里要保存一個狀態(tài)值,用來表示3個任務(wù)的執(zhí)行狀態(tài),一個任務(wù)執(zhí)行完成后,就修改狀態(tài)值,并檢查其他2個任務(wù)是否完成,如果都完成了,就匯總?cè)蝿?wù)結(jié)果,再處理。
回答2:@xiaoboost 手工維護(hù)狀態(tài)可行,但有點費事。
Celery 是可以設(shè)計執(zhí)行流程的,參考文檔:Designing Work-flows題主的需求可以用 chords 搞定,在 celery task 里返回值就行。
BTW: 注意一下 Celery 配置中與返回值相關(guān)的幾個選項,比如這個 task_ignore_result
相關(guān)文章:
1. javascript - Vue.js2.0不能使用debounce后大伙一般是如何解決延遲請求的問題的呢。2. java - 如何讓maven優(yōu)先使用用戶setting.xml的配置?3. Python的os.listdir在獲取文件列表時的順序問題4. docker start -a dockername 老是卡住,什么情況?5. 統(tǒng)計 - MYSQL版本問題導(dǎo)致SQL語法錯誤!unknow column ’SQLSTR’6. 這是什么情況???7. initPage:是什么意思? 是返回的意思嗎?8. javascript - 有適合開發(fā)手機(jī)端Html5網(wǎng)頁小游戲的前端框架嗎?9. javascript - vue使用videojs+videojs-contrib-hls報錯10. css - 微信小程序點擊展開,再次點擊收回
