एक बनाना AsyncResult
कार्य आईडी से वस्तु है रास्ते में सिफारिश पूछे जाने वाले प्रश्न कार्य की स्थिति प्राप्त करने के लिए जब केवल एक चीज आप काम आईडी है।
हालांकि, सेलेरी 3.x के रूप में, ऐसे महत्वपूर्ण चेतावनी हैं जो लोगों को काट सकते हैं यदि वे उन पर ध्यान नहीं देते हैं। यह वास्तव में विशिष्ट उपयोग के मामले पर निर्भर करता है।
डिफ़ॉल्ट रूप से, सेलेरी "रनिंग" स्थिति रिकॉर्ड नहीं करता है।
आदेश में अजवाइन है कि एक कार्य चल रहा है रिकॉर्ड करने के लिए के लिए, आप सेट करना होगा task_track_started
करने के लिए True
। यहाँ एक सरल कार्य है जो इसका परीक्षण करता है:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
कब task_track_started
है False
, कौन सा डिफ़ॉल्ट है, राज्य शो PENDING
भले ही कार्य शुरू हो गया है। यदि आप सेट task_track_started
करते हैं True
, तो राज्य होगा STARTED
।
राज्य का PENDING
अर्थ है "मैं नहीं जानता।"
AsyncResult
राज्य के साथ ए का PENDING
मतलब इससे अधिक नहीं है कि सेलेरी को कार्य की स्थिति का पता नहीं है। यह किसी भी कारण से हो सकता है।
एक काम के लिए, AsyncResult
अमान्य कार्य आईडी के साथ निर्माण किया जा सकता है। इस तरह के "कार्य" को सेलेरी द्वारा लंबित समझा जाएगा:
>>> task.AsyncResult("invalid").status
'PENDING'
ठीक है, तो कोई भी स्पष्ट रूप से अमान्य आईडी को खिलाने वाला नहीं है AsyncResult
। पर्याप्त रूप से उचित है, लेकिन यह प्रभाव के लिए भी है जो AsyncResult
एक ऐसे कार्य पर भी विचार करेगा जो सफलतापूर्वक चला है लेकिन यह अजवाइन के रूप में भूल गया है PENDING
। फिर से, कुछ उपयोग-मामले परिदृश्यों में यह एक समस्या हो सकती है। कार्य के परिणामों को रखने के लिए अजवाइन को कैसे कॉन्फ़िगर किया गया है, इस मुद्दे का एक हिस्सा टिका है, क्योंकि यह परिणाम बैकएंड में "कब्रिस्तान" की उपलब्धता पर निर्भर करता है। ("टॉम्बस्टोंस" डेटा चंक्स के लिए सेलेरी डॉक्यूमेंटेशन में उपयोग किया गया शब्द है जो यह बताता है कि कार्य कैसे समाप्त हुआ।) का उपयोग करना AsyncResult
काम नहीं करेगा यदि task_ignore_result
है तो True
। एक और अधिक गंभीर समस्या यह है कि सेलेरी डिफ़ॉल्ट रूप से कब्रों को समाप्त कर देता है। result_expires
डिफ़ॉल्ट रूप से सेटिंग 24 घंटे पर सेट होती है। इसलिए यदि आप एक कार्य लॉन्च करते हैं, और आईडी को दीर्घकालिक भंडारण में रिकॉर्ड करते हैं, और अधिक 24 घंटे बाद, आप AsyncResult
इसके साथ बनाते हैं , तो स्थिति होगी PENDING
।
सभी "वास्तविक कार्य" PENDING
राज्य में शुरू होते हैं । इसलिए PENDING
किसी कार्य को करने का अर्थ यह हो सकता है कि कार्य का अनुरोध किया गया था, लेकिन इससे आगे कभी भी प्रगति नहीं हुई (जो भी कारण हो)। या इसका मतलब यह हो सकता है कि कार्य चला लेकिन सेलेरी अपना राज्य भूल गई।
आउच! AsyncResult
मेरे लिए काम नहीं करेगा। मैं और क्या कर सकता हुँ?
मैं कार्यों का ट्रैक रखने के बजाय लक्ष्यों पर नज़र रखना पसंद करता हूं । मैं कुछ कार्य जानकारी रखता हूँ लेकिन लक्ष्यों पर नज़र रखना वास्तव में गौण है। लक्ष्य सेलेरी से स्वतंत्र भंडारण में रखे गए हैं। जब अनुरोध करने के लिए एक संगणना करने की आवश्यकता होती है, तो कुछ लक्ष्य प्राप्त होने पर निर्भर करता है, यह जाँचता है कि क्या लक्ष्य पहले ही प्राप्त किया जा चुका है, यदि हाँ, तो वह इस कैश्ड लक्ष्य का उपयोग करता है, अन्यथा यह उस कार्य को शुरू करता है जो लक्ष्य को प्रभावित करेगा, और उसे भेजता है क्लाइंट जो HTTP बनाता है वह एक प्रतिक्रिया का अनुरोध करता है जो इंगित करता है कि उसे परिणाम का इंतजार करना चाहिए।
उपरोक्त चर नाम और हाइपरलिंक Celery 4.x के लिए हैं। 3.x में इसी चर और हाइपरलिंक हैं: CELERY_TRACK_STARTED
, CELERY_IGNORE_RESULT
, CELERY_TASK_RESULT_EXPIRES
।
x
?