2013-02-28 78 views
3
@celery.task 
def my_task(my_object): 
    do_something_to_my_object(my_object) 


#in the code somewhere 
tasks = celery.group([my_task.s(obj) for obj in MyModel.objects.all()]) 
group_task = tasks.apply_async() 

問題:芹菜是否有東西可以檢測到組任務的進度?我可以得到有多少任務在那裏,有多少人已經處理?跟蹤celery.group任務的進度?

回答

3

擺弄殼(ipython的選項卡自動完成)我發現group_task(這是一個celery.result.ResultSet對象)有一個名爲completed_count的方法,它給出了我所需要的。

還發現在http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.ResultSet.completed_count

+0

嗨,你可能已經很長時間了,因爲你遇到了這個問題,但我想知道你如何使用它來跟蹤沒有阻塞的組任務的進度..?據我所知,我需要分配'result = task_group.apply_async()',但僅僅分配本身就會阻塞。另一方面,如果我們不分配,我們沒有ResultSet方法,它們是'completed_count'等等...... – zerohedge 2017-12-29 09:55:18

0

閱讀的文檔的文檔AsyncResult有一個collect方法,因爲他們進來收集結果

http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.AsyncResult.collect

from celery import group 
from proj.celery import app 

@app.task(trail=True) 
def A(how_many): 
    return group(B.s(i) for i in range(how_many))() 

@app.task(trail=True) 
def B(i): 
    return pow2.delay(i) 

@app.task(trail=True) 
def pow2(i): 
    return i ** 2 

實施例輸出:

>>> from celery.result import ResultBase 
>>> from proj.tasks import A 

>>> result = A.delay(10) 
>>> [v for v in result.collect() 
... if not isinstance(v, (ResultBase, tuple))] 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

注意: 必須啓用Task.trail選項,以便將子項列表存儲在result.children中。這是默認值,但是爲了說明而明確啓用。