सेलेरी में कार्य की स्थिति कैसे जांचें?


91

कोई कैसे जाँचता है कि क्या कोई कार्य अजवाइन में चल रहा है (विशेष रूप से, मैं अजवाइन- django का उपयोग कर रहा हूँ)?

मैंने दस्तावेज़ीकरण पढ़ा है, और मैंने गुगली की है, लेकिन मैं एक कॉल नहीं देख सकता जैसे:

my_example_task.state() == RUNNING

मेरा उपयोग-मामला यह है कि मेरे पास ट्रांसकोडिंग के लिए एक बाहरी (जावा) सेवा है। जब मैं ट्रांसकोड किए जाने के लिए एक दस्तावेज भेजता हूं, तो मैं यह जांचना चाहता हूं कि क्या कार्य जो उस सेवा को चलाता है, और यदि नहीं, तो (फिर से) इसे शुरू करें।

मैं वर्तमान स्थिर संस्करणों का उपयोग कर रहा हूं - 2.4, मुझे विश्वास है।

जवाबों:


97

Task_id (जो कि .delay () से दिया गया है) लौटें और राज्य के बारे में बाद में अजवाइन का उदाहरण पूछें:

x = method.delay(1,2)
print x.task_id

पूछते समय, इस task_id का उपयोग करके एक नया AsyncResult प्राप्त करें:

from celery.result import AsyncResult
res = AsyncResult("your-task-id")
res.ready()

10
धन्यवाद, लेकिन क्या होगा अगर मेरे पास पहुंच नहीं है x?
मार्सिन

4
अजवाइन में आप अपनी नौकरी कहाँ लगाते हैं? वहां आपको भविष्य में नौकरी को ट्रैक करने के लिए task_id को वापस करना होगा।
ग्रेगोर

@ Marcin's के विपरीत, यह उत्तर स्थिर विधि टास्क का उपयोग नहीं करता है। AsyncResult के कारखाने के रूप में Task.AsyncResult (), जो बैकएंड कॉन्फ़िगरेशन का पुन: उपयोग करता है, अन्यथा परिणाम प्राप्त करने की कोशिश करते समय एक त्रुटि उठाई जाती है।
अरनूऑरिओल्स 1

2
@Chris @ वृत्त कोड के साथ विवाद तात्कालिकता में है async_result। आपके उपयोग के मामले में आपके पास पहले से ही उदाहरण है, आप जाने के लिए अच्छे हैं। लेकिन क्या होगा यदि आपके पास केवल कार्य आईडी है, और async_resultकॉल करने में सक्षम होने के लिए एक इंस्टेंट को तुरंत करने की आवश्यकता है async_result.get()? यह AsyncResultवर्ग का एक उदाहरण है , लेकिन आप कच्ची कक्षा का उपयोग नहीं कर सकते हैं celery.result.AsyncResult, आपको इसके द्वारा लिपटे फ़ंक्शन से कक्षा प्राप्त करने की आवश्यकता है app.task()। आप के मामले में आप करेंगेasync_result = run_instance.AsyncResult('task-id')
ArnauOrriols

1
but you cannot use the raw class celery.result.AsyncResult, you need to get the class from the function wrapped by app.task(). - मुझे लगता है कि यह वास्तव में कैसे इस्तेमाल किया जाना चाहिए था। कोड को पढ़ें: github.com/celery/celery/blob/…
nevelis

69

एक बनाना 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


इसलिए अगर मैं बाद में परिणाम की जांच करना चाहता हूं (शायद किसी अन्य प्रक्रिया के भीतर भी), तो मैं अपने कार्यान्वयन के साथ बेहतर हूं? डेटाबेस में परिणाम को मैन्युअल रूप से संग्रहीत करना?
फ्रैंकलिन यू

हां, मैं "कार्यों" का ट्रैक रखने से "लक्ष्य" का ट्रैक अलग रखूंगा। मैंने लिखा है "एक अभिकलन निष्पादित करें जो कुछ लक्ष्य पर निर्भर करता है"। आमतौर पर, "लक्ष्य" एक संगणना भी है। उदाहरण के लिए, यदि मैं एक उपयोगकर्ता को लेख एक्स दिखाना चाहता हूं, तो मुझे इसे XML से HTML में बदलना होगा, लेकिन इससे पहले, मुझे सभी ग्रंथ सूची संदर्भों को हल करना होगा। (एक्स एक जर्नल लेख की तरह है।) मैं जाँचता हूं कि क्या लक्ष्य "आलेख एक्स हल किए गए सभी ग्रंथसूची संदर्भों के साथ मौजूद है" मौजूद है और इसका उपयोग करें बजाय इसके कि मैं सेलेरी के कार्य की स्थिति की जांच करने का प्रयास करूं, जो लक्ष्य मैं चाहता हूं।
लुई

और जानकारी "लेख एक्स के साथ सभी ग्रंथ सूची संदर्भ हल" एक मेमोरी कैश में संग्रहीत है और एक ईएक्सआईटी-डीबी डेटाबेस में संग्रहीत है।
लुई

61

प्रत्येक Taskवस्तु में एक .requestगुण होता है, जिसमें वह AsyncRequestवस्तु होती है। तदनुसार, निम्न पंक्ति एक कार्य की स्थिति देती है task:

task.AsyncResult(task.request.id).state

2
क्या किसी कार्य की प्रगति के प्रतिशत को संग्रहीत करने का एक तरीका है?
पैट्रिक

4
जब मैं ऐसा करता हूं, मुझे स्थायी रूप से P Asing AsyncResult मिलता है, भले ही मैं कार्य समाप्त होने के लिए लंबे समय तक प्रतीक्षा करता हूं। क्या यह राज्य परिवर्तन देखने का एक तरीका है? मेरा मानना ​​है कि मेरा बैकएंड कॉन्फ़िगर किया गया है, और मैंने CELERY_TRACK_STARTED = True पर कोई लाभ नहीं होने का प्रयास किया।
dstromberg

1
@dstromberg दुर्भाग्य से यह 4 साल हो गया है क्योंकि यह मेरे लिए एक मुद्दा था, इसलिए मैं मदद नहीं कर सकता। आप निश्चित रूप से स्थिति को ट्रैक करने के लिए अजवाइन को कॉन्फ़िगर करने की आवश्यकता है।
मार्सिन

16

आप कस्टम स्टेट्स भी बना सकते हैं और अपडेट कर सकते हैं कि यह मूल्य निष्पादन कार्य निष्पादन है। यह उदाहरण डॉक्स से है:

@app.task(bind=True)
def upload_files(self, filenames):
    for i, file in enumerate(filenames):
        if not self.request.called_directly:
            self.update_state(state='PROGRESS',
                meta={'current': i, 'total': len(filenames)})

http://celery.readthedocs.org/en/latest/userguide/tasks.html#custom-states


11

पुराना सवाल है लेकिन मैं हाल ही में इस समस्या में भाग गया।

यदि आप task_id पाने की कोशिश कर रहे हैं, तो आप इसे इस तरह कर सकते हैं:

import celery
from celery_app import add
from celery import uuid

task_id = uuid()
result = add.apply_async((2, 2), task_id=task_id)

अब आप जान गए हैं कि task_id क्या है और अब इसे AsyncResult प्राप्त करने के लिए उपयोग कर सकते हैं:

# grab the AsyncResult 
result = celery.result.AsyncResult(task_id)

# print the task id
print result.task_id
09dad9cf-c9fa-4aee-933f-ff54dae39bdf

# print the AsyncResult's status
print result.status
SUCCESS

# print the result returned 
print result.result
4

3
अपनी खुद की टास्क आईडी बनाने और इसे पास करने की बिल्कुल जरूरत नहीं है apply_async। द्वारा लौटाई गई वस्तु apply_async एक AsyncResultवस्तु है, जिसमें उस कार्य की आईडी है जिसे सेलेरी ने उत्पन्न किया है।
लुई

1
अगर मैं गलत हूं तो मुझे सुधारें, लेकिन क्या कभी-कभी कुछ इनपुट्स के आधार पर यूयूआईडी जेनरेट करना उपयोगी नहीं होता है, ताकि सभी कॉल्स पर एक ही इनपुट मिल रहे हों, एक ही यूयूआईडी हो? IOW, शायद कभी-कभी यह आपके task_id को निर्दिष्ट करने के लिए उपयोगी है।
dstromberg

1
@dstromberg ओपी द्वारा पूछा गया प्रश्न "मैं कार्य की स्थिति की जाँच कैसे करता हूँ" और यहाँ उत्तर कहता है कि "यदि आप task_id प्राप्त करने का प्रयास कर रहे हैं ..."। न तो कार्य की स्थिति की जांच, नहीं मिल रहा है task_idआवश्यकता है कि आप उत्पन्न एक कार्य आईडी अपने आप को। अपनी टिप्पणी में, आपने एक कारण की कल्पना की है जो " और मैं कार्य की स्थिति की जांच कैसे करता हूं" से परे है और "यदि आप task_id प्राप्त करने का प्रयास कर रहे हैं ...` महान यदि आपके पास वह ज़रूरत है, लेकिन ऐसा नहीं है यहाँ (इसके अलावा, uuid()एक कार्य आईडी उत्पन्न करने के लिए उपयोग करना पूरी तरह से कुछ भी नहीं है जो सेलेरी डिफ़ॉल्ट रूप से आगे नहीं करता है।)
लुई

मैं इस बात से सहमत हूं कि ओपी ने विशेष रूप से अनुमान लगाने योग्य कार्य आईडी प्राप्त करने का तरीका नहीं पूछा था, लेकिन वर्तमान में ओपी के प्रश्न का उत्तर "कार्य आईडी को ट्रैक करना और x करना" है। यह मुझे लगता है कि कार्य आईडी पर नज़र रखना कई प्रकार की स्थितियों में अव्यावहारिक है, ताकि उत्तर वास्तव में संतोषजनक न हो। यह उत्तर मुझे अपने उपयोग के मामले को हल करने में मदद करता है (यदि मैं अन्य विख्यात सीमाओं को पार कर सकता हूं) उसी कारण @dstromberg बताते हैं - उस कारण के लिए प्रेरित किया गया था या नहीं।
क्लेटनटैंड


1

2020 का उत्तर:

#### tasks.py
@celery.task()
def mytask(arg1):
    print(arg1)

#### blueprint.py
@bp.route("/args/arg1=<arg1>")
def sleeper(arg1):
    process = mytask.apply_async(args=(arg1,)) #mytask.delay(arg1)
    state = process.state
    return f"Thanks for your patience, your job {process.task_id} \
             is being processed. Status {state}"

0

प्रयत्न:

task.AsyncResult(task.request.id).state

यह सेलेरी टास्क का दर्जा प्रदान करेगा। यदि सेलेरी टास्क पहले से ही विफल स्थिति में है तो यह एक अपवाद फेंक देगा:

raised unexpected: KeyError('exc_type',)


0

सरल कार्यों के लिए, हम निगरानी करने के लिए http://flower.readthedocs.io/en/latest/screenshots.html और http://policystat.github.io/jobtastic/ का उपयोग कर सकते हैं ।

और जटिल कार्यों के लिए, एक ऐसा कार्य कहें जो बहुत से अन्य मॉड्यूल से संबंधित हो। हम विशेष कार्य इकाई पर प्रगति और संदेश को मैन्युअल रूप से रिकॉर्ड करने की सलाह देते हैं।


0

मुझे इसमें उपयोगी जानकारी मिली

सेलेरी प्रोजेक्ट वर्कर्स गाइड-इंस्पेक्टिंग-वर्कर्स

मेरे मामले के लिए, मैं यह देखने के लिए जाँच कर रहा हूं कि क्या सेलेरी चल रही है।

inspect_workers = task.app.control.inspect()
if inspect_workers.registered() is None:
    state = 'FAILURE'
else:
    state = str(task.state) 

आप अपनी आवश्यकताओं को प्राप्त करने के लिए निरीक्षण के साथ खेल सकते हैं।


0
  • पहले अपने अजवाइन एपीपी में c

vi my_celery_apps / app1.py

app = Celery(worker_name)
  • और अगला, कार्य फ़ाइल में बदलें। अपने अजवाइन ऐप मॉड्यूल से आयात ऐप।

vi कार्य / task1.py

from my_celery_apps.app1 import app

app.AsyncResult(taskid)

try:
   if task.state.lower() != "success":
        return
except:
    """ do something """


-1

उपरोक्त प्रोग्राम के अलावा फ्लावर टास्क की स्थिति का उपयोग करके आसानी से देखा जा सकता है।

अजवाइन की घटनाओं का उपयोग करते हुए वास्तविक समय की निगरानी। फूल अजवाइन समूहों की निगरानी और प्रशासन के लिए एक वेब आधारित उपकरण है।

  1. कार्य प्रगति और इतिहास
  2. कार्य विवरण दिखाने की क्षमता (तर्क, प्रारंभ समय, क्रम, और बहुत कुछ)
  3. रेखांकन और आँकड़े

आधिकारिक दस्तावेज: फूल - अजवाइन की निगरानी उपकरण

स्थापना:

$ pip install flower

उपयोग:

http://localhost:5555

-1
res = method.delay()
    
print(f"id={res.id}, state={res.state}, status={res.status} ")

print(res.get())

2
कृपया केवल कोड को उत्तर के रूप में पोस्ट न करें, बल्कि यह भी बताएं कि आपका कोड क्या करता है और यह कैसे प्रश्न की समस्या को हल करता है। एक स्पष्टीकरण के साथ उत्तर आमतौर पर अधिक सहायक और बेहतर गुणवत्ता के होते हैं, और upvotes को आकर्षित करने की अधिक संभावना होती है।
मार्क रोटेटेवेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.