2014-10-06 35 views
5

istisnası var ise görevler argümanlarını al, Celery ve Python ile çalışmaya başladım ve muhtemelen çok basit bir soru var, ama etrafta uygun bir cevabı bulamıyorum.Python kereviz:

Bir sürü görevim varsa ve bunlardan biri atarsa, bir istisna, bu göreve gönderilen argümanları geri almanın bir yolu var mı? Bir istisna atabilir Örneğin

, bazı hostnames çözümlemek IP'leri almak istiyorum, ve bir görev oluşturmak eğer ...

@tasks_app.task 
def resolve_hostname(hostname): 
    return (hostname, {hst.address for hst in dns.resolver.query(hostname)}) 

... almanın bir yolu var Bu Özel Durum gerçekleştiğinde, aramanın dışındaki hostname bağımsız değişkeninin değeri nedir? Bir istisna yükseltecektir (failure.kommm çözümlemeye çalışır)

ip_subtasks = group(
    resolve_hostname.s(hostname) for hostname in ['google.com', 
                'yahoo.com', 
                'failure.kommm'] 
)() 

sonuncusu:

ı grubu gibi görevleri diyelim. Ben try/catch içine kereviz görevin get() yöntemini koymak ister ve (aşağıda gösterildiği gibi bir şey) bir şey failure.kommm çözümlemeye çalışırken ters gitti diyerek mesajı gösterirdim:

Yani
for ip_subtask in ip_subtasks: 
    try: 
     hostname, ips = ip_subtask.get(timeout=45) 
    except dns.exception.DNSException, e: 
     # I WISHED THIS WORKED: 
     logger.exception("Something happened when trying" 
         " to resolve %s" % ip_subtask.args[0]) 

, Bu soru ... Görev örneğinin kendisindeyim, bir görevin yürütüldüğü argümanları geri almanın bir yolu var mı?

Önceden teşekkür ederiz.

+0

bir 'on_failure' işleyicisi baktınız mı? http://celery.readthedocs.org/en/latest/userguide/tasks.html#on_failure – Ngenator

+0

Elimde var ve bence işe yarayacak, ancak görev bir dekoratör yukarıda gösterildiği gibi (dediğim gibi, Celery'la yeni başlayan biriyim) – BorrajaX

+0

Yukarıdaki işleyicilere göz atın, bunu sadece soyut bir sınıfla nasıl yapacağınızı gösterir. – Ngenator

cevap

7

Bunu yapmak için on_failure işleyicisini uygulamak üzere abstract class kullanabilirsiniz. Dokümanlar

from celery import Task 

class DebugTask(Task): 
    abstract = True 

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     logger.exception("Something happened when trying" 
         " to resolve %s" % args[0]) 

@tasks_app.task(base=DebugTask) 
def resolve_hostname(hostname): 
    return (hostname, {hst.address for hst in dns.resolver.query(hostname)}) 

:

on_failure(self, exc, task_id, args, kwargs, einfo) 

Parameters: 
    exc  – The exception raised by the task. 
    task_id – Unique id of the failed task. 
    args – Original arguments for the task that failed. 
    kwargs – Original keyword arguments for the task that failed. 
    einfo – ExceptionInfo instance, containing the traceback.