2010-07-21 36 views
55

कार्य के भीतर से कार्य के लिए task_id मान कैसे प्राप्त कर सकता हूं? यहाँ मेरी कोड है:सेलेरी - वर्तमान कार्य के लिए कार्य आईडी प्राप्त करें

from celery.decorators import task 
from django.core.cache import cache 

@task 
def do_job(path): 
    "Performs an operation on a file" 

    # ... Code to perform the operation ... 

    cache.set(current_task_id, operation_results) 

विचार यह है कि जब मैं काम का एक नया उदाहरण बनाने के लिए, मैं काम वस्तु से task_id पुनः प्राप्त है। मैं फिर कार्य आईडी का उपयोग यह निर्धारित करने के लिए करता हूं कि कार्य पूरा हो गया है या नहीं। I path मान द्वारा कार्य को ट्रैक रखना चाहते हैं क्योंकि कार्य पूर्ण होने के बाद फ़ाइल "साफ़ हो गई" है, और हो सकती है या नहीं भी हो सकती है।

उपरोक्त उदाहरण में, मुझे current_task_id का मान कैसे प्राप्त होगा?

उत्तर

7

यदि कार्य उन्हें स्वीकार करता है तो सेलेरी कुछ डिफ़ॉल्ट कीवर्ड तर्क सेट करता है। (ताकि वे भी kwargs का उपयोग कर ** द्वारा स्वीकार कर सकते हैं, या उन्हें विशेष रूप से सूची)

@task 
def do_job(path, task_id=None): 
    cache.set(task_id, operation_results) 

डिफ़ॉल्ट कीवर्ड तर्कों की सूची यहाँ प्रलेखित है: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

+28

इसे सेलेरी 2.2.0 (नीचे उत्तर देखें) के रूप में बहिष्कृत किया गया है। – Simon

96

अजवाइन 2.2.0 के बाद से, से संबंधित जानकारी वर्तमान में निष्पादित कार्य task.request में सहेजा गया है (इसे «संदर्भ» कहा जाता है)। (नहीं कीवर्ड तर्क है, जो अनुचित हैं से) तो तुम इस संदर्भ से काम आईडी मिलना चाहिए:

@task 
def do_job(path): 
    cache.set(do_job.request.id, operation_results) 

सभी उपलब्ध फ़ील्ड की सूची यहाँ प्रलेखित है: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

+0

क्या आप इस आईडी को कार्य के बाहर प्राप्त कर सकते हैं? उदाहरण के लिए रन कार्य करें, आईडी प्राप्त करें और कार्य समाप्त होने पर इस आईडी से जांचें। – DominiCane

+0

हां, आप AsyncResult से आईडी प्राप्त कर सकते हैं, और उसके बाद आईडी द्वारा AsyncResult को फिर से बना सकते हैं, दस्तावेज़ों की जांच करें http://docs.celeryproject.org/en/latest/reference/celery.result.html – HighCat

34

अजवाइन 3.1 के रूप में, आप कर सकते हैं bind सजावटी तर्क का उपयोग करें, और वर्तमान अनुरोध तक पहुंच प्राप्त करें:

@task(bind=True) 
def do_job(self, path): 
    cache.set(self.request.id, operation_results) 
+0

नई प्रतिक्रिया के लिए धन्यवाद । एक जादू की तरह काम करता है –

संबंधित मुद्दे