python - celery工作流的問(wèn)題
問(wèn)題描述
celery中,我做這樣的處理:一個(gè)url經(jīng)過(guò)a, b, c三個(gè)的函數(shù),分別獲得返回值,其中任意函數(shù)結(jié)果均與任意其他函數(shù)結(jié)果不相關(guān),然后匯總起來(lái),交給之后的流程.這樣,我自然想到并行運(yùn)行三個(gè)函數(shù)來(lái)加快處理速度.然而由于一開(kāi)始的設(shè)計(jì)問(wèn)題, a函數(shù)式被設(shè)計(jì)成了一次可以處理多個(gè)url的形式,而一個(gè)一個(gè)的處理會(huì)非常慢.
@celery.taskdef a(url_list): ’...do something...’ for url in url_list:b.delay(url)
我嘗試這樣控制,然而任務(wù)似乎并不能嵌套.那么,如何設(shè)計(jì)可以比較好的滿足我這種比較奇怪的流程和要求呢?
問(wèn)題解答
回答1:應(yīng)該把a(bǔ);b;c拆開(kāi),寫(xiě)成3個(gè)task, 同時(shí)數(shù)據(jù)庫(kù)里要保存一個(gè)狀態(tài)值,用來(lái)表示3個(gè)任務(wù)的執(zhí)行狀態(tài),一個(gè)任務(wù)執(zhí)行完成后,就修改狀態(tài)值,并檢查其他2個(gè)任務(wù)是否完成,如果都完成了,就匯總?cè)蝿?wù)結(jié)果,再處理。
回答2:@xiaoboost 手工維護(hù)狀態(tài)可行,但有點(diǎn)費(fèi)事。
Celery 是可以設(shè)計(jì)執(zhí)行流程的,參考文檔:Designing Work-flows題主的需求可以用 chords 搞定,在 celery task 里返回值就行。
BTW: 注意一下 Celery 配置中與返回值相關(guān)的幾個(gè)選項(xiàng),比如這個(gè) task_ignore_result
相關(guān)文章:
1. 想找個(gè)php大神仿個(gè)網(wǎng)站。2. nginx配置server模塊的問(wèn)題3. css3 - Typecho 后臺(tái)部分表單按鈕在 Chrome 下出現(xiàn)靈異動(dòng)畫(huà)問(wèn)題,求解決4. javascript - 怎樣限制同一個(gè)瀏覽器不能登錄兩個(gè)賬號(hào)5. java - android代碼重構(gòu):如何把a(bǔ)pp設(shè)置里的頭像UI做成通用的?6. java - 新手做一個(gè)安卓視頻播放器,想實(shí)現(xiàn)一個(gè)進(jìn)度條,按鈕那種在視頻下方懸浮的功能,不知道思路!7. javascript - jquery怎么給select option一個(gè)點(diǎn)擊時(shí)觸發(fā)的事件,如圖 如果選擇自定義觸發(fā)一個(gè)時(shí)間?8. javascript - angular和jquery都用到了$符號(hào),一起用會(huì)不會(huì)沖突?9. 如何將行內(nèi)塊元素的內(nèi)容垂直水平兩個(gè)方向居中?10. mysql優(yōu)化 - 關(guān)于mysql分區(qū)
