2010-10-10 126 views
30

Celery documentation暗示有任務等待其他任務的結果是一個壞主意......但建議的解決方案(請參閱「好」標題)留下了一些需要的東西。具體而言,沒有明確的方式將子任務的結果返回給調用者(也是很醜陋的)。Python +芹菜:鏈接工作?

那麼,有沒有什麼方法「鏈接」工作,所以調用者獲得最終工作的結果?例如,使用add例如:

>>> add3 = add.subtask(args=(3,)) 
>>> add.delay(1, 2, callback=add3).get() 
6 

或者,是不是確定返回結果的情況下?例如:

@task 
def add(x, y, callback=None): 
    result = x + y 
    if callback: 
     return subtask(callback).delay(result) 
    return result 

這將讓該鏈中的「最終」工作的結果可以用一個簡單的被retrived:

result = add(1, 2, callback=add3).delay() 
while isinstance(result, Result): 
    result = result.get() 
print "result:", result 
+0

什麼你建議將正常工作。我沒有看到任何其他的選擇,是嗎? – asksol 2010-10-11 08:55:31

回答

30

您可以用芹菜鏈做到這一點。見https://celery.readthedocs.org/en/latest/userguide/canvas.html#chains

@task() 
def add(a, b): 
    time.sleep(5) # simulate long time processing 
    return a + b 

鏈接工作:

# import chain from celery import chain 
# the result of the first add job will be 
# the first argument of the second add job 
ret = chain(add.s(1, 2), add.s(3)).apply_async() 

# another way to express a chain using pipes 
ret2 = (add.s(1, 2) | add.s(3)).apply_async() 

... 

# check ret status to get result 
if ret.status == u'SUCCESS': 
    print "result:", ret.get() 
+0

嗨,我試圖得到這樣的建議鏈接過程的結果,但得到警告: '[2016-09-15 16:20:52,684:WARNING/Worker-7] /Library/Python/2.7/site- packages/celery/result.py:45:RuntimeWarning:從不在任務中調用result.get()! 參見http:// docs.celeryq.org/en/ latest/userguide/tasks.html#task-synchronous-subtasks'' '在Celery 3.2中,這會導致例外情況是 被引發,而不僅僅是一個警告「。 我使用鏈接爲'result = chain(...,...,...)的子任務。delay()。get()'你能解釋爲什麼它會引發問題,儘管子任務是由連鎖法? – user305883 2016-09-15 14:16:54