2010-10-10 21 views
30

Celery documentationCelery documentation, görevlerin diğer görevlerin sonuçlarında beklemesini sağlamak için kötü bir fikir olduğunu öne sürüyor… Ancak önerilen çözüm (“iyi” başlığa bakın) istenen bir şey bırakıyor. Spesifik olarak, alttakinin sonucunu arayan kişiye geri götürmenin açık bir yolu yoktur (aynı zamanda çirkin bir şeydir).Python + Celery: Chaining işler?

Yani, “zincirleme” işlerinin herhangi bir yolu var mı, bu yüzden arayan son işin sonucunu alıyor? Örneğin, add örnek kullanımı:

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

Alternatif olarak, bu Sonuç örneklerini dönmek için OK? Örneğin:

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

Bu zincirdeki “nihai” işinin sonucu basit ile retrived olabilir izin verir:

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

Ne önermek iyi çalışacak. Başka bir alternatif görmüyorum, değil mi? – asksol

cevap

30

Bir kereviz zinciri ile yapabilirsiniz. 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 

Zincirleme işi bakınız:

# 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

Merhaba, bu öneri gibi zincirleme bir işlemin sonucunu almaya çalışıyorum ancak uyarı alın: '[2016-09-15 16: 20: 52,684: UYARI/Worker-7] /Library/Python/2.7/site- paketleri/celery/result.py: 45: RuntimeWarning: Bir sonuç içinde result.get() öğesini asla çağırmayın! 'http: // docs.celeryq.org/tr/latest/userguide/tasks.html # task-synchronous-subtasks'' ' 'Kereviz 3.2'de bu, yalnızca bir varlık olmak yerine yükseltilmesiyle sonuçlanacaktır. warning Düzeltme: Alt zincirlerin işlenmesine rağmen neden sonuçlandıracağını açıklayan "result = chain (..., ..., ...). delay(). get()" zincir yöntemi? – user305883