2013-03-17 82 views
2

我有一個生成通過Python的itertools產品大名單的程序;基本上是一組大量的單詞組合。有多個集合可以運行products()函數。我想要做的是讓Celery幫忙,把每一套芹菜任務分配給不同的芹菜任務,最後把它們結合起來。我的理解是和絃是做到這一點的方法。Django的芹菜和絃不予執行

所以基本上我有這樣的:

callback = tabulate_results.subtask() 
header = [] 
for combo in combos_to_run: 
    header.append(run_product.subtask(args=(object_terms, combo))) 
result = chord(header)(callback) 
result.get() 

和它的兩個配套,簡裝功能:

from celery import subtask, chord 
@task() 
def run_product(object_list, combo_set): 
    results = [] 
    for result in product(object_list, *combo_set): 
     results.append(result) 
    return results 

@task() 
def tabulate_results(result_sets): 
    master_set = [] 
    for result_set in result_sets: 
     master_set.extend(result_set) 

    return master_set 

起初,和絃任務沒有顯示在celeryev,但我有一個這裏的問題引用:Django Celery - Missing something but I have no idea what? Have results but can't get them約芹​​菜返回具有結果通過MySQL的跟蹤做了一個錯誤。我的確在使用MySQL作爲我的結果後端,並將其切換到Redis中。但是,現在我有一個新問題。當我通過代碼通過Django的shell中運行,沒有任務出現在celeryev,並沒有返回超出了:

R IS: <GroupResult: 9f658e8d-591f-4fa9-9e79-4db0c51e8331 [9b199d1e-061f-413c-9521-4a3051dd121a, 2effbfb5-c9dc-4569-a63f-656c233a9387, 80911a60-6a22-46bb-83a1-d5a84c659794, 70acfa43-8ffe-4bc8-8ff1-1df6def035e1, dd417423-d1f6-44eb-8c4b-2ded40d7614f, fbff8adc-815d-459c-b914-b30528dbbd39]> 

基本上是一個芹菜的消息,但沒有數據。該代碼也永遠不會返回,並且我的光標懸掛。當我控制-C輸出時,行號在Celery中似乎正在等待。儘管celeryev沒有給我任何任務,但我不知道該怎麼做。我已確認其他任務在celeryev中顯示。

我通常測試我的功能,而無需運行它們如芹菜任務,他們正常返回。

短版 我試圖讓芹菜和絃,以幫助在我的Django應用程序的密集Python的任務,但他們似乎並沒有被返回任何結果,或者得到進入celeryev。 Redis後端。芹菜版本3.0.15。 Django 1.4。

+0

您是否嘗試過的時間限制爲標題的任務,並定義[錯誤處理](http://docs.celeryproject.org/en/latest/userguide/canvas.html#error-handling)? – guival 2016-08-23 12:12:59

回答

1

首先,它通常被認爲是不好的做法,對他人的結果一個任務等待(這就是爲什麼要用過鏈子任務) - source

除此之外,在貼上的語法你的和絃不正確。以下是相關鏈接:http://docs.celeryproject.org/en/master/getting-started/next-steps.html#chords。在其他問題中,您的代碼不會將任何任務傳遞給和絃。和絃只是一組作爲一個組被處理的任務,然後回調被觸發。從文檔,這裏是一個和絃的正確語法:

>>> from celery import chord 
>>> from proj.tasks import add, xsum 

>>> chord((add.s(i, i) for i in xrange(10)), xsum.s())().get() 
90 

注意,和絃有兩個參數,該組的初始任務,一方面是和回調(用逗號分隔),在其他。

這是一個開始,但它聽起來像花更多的時間與文檔將幫助你比什麼都重要。

+0

如果你看看這個[例](http://docs.celeryproject.org/en/latest/userguide/canvas.html#chords)雖然,格式相匹配。 – guival 2016-08-23 12:10:43