2011-12-14 17 views
33

मैं Celery का उपयोग एसिंक्रोनस कार्यों को प्रबंधित करने के लिए कर रहा हूं। कभी-कभी, हालांकि, अजवाइन की प्रक्रिया नीचे जाती है जिससे किसी भी कार्य को निष्पादित नहीं किया जाता है। मैं अजवाइन की स्थिति की जांच करने में सक्षम होना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि सब कुछ ठीक काम कर रहा है, और यदि मुझे कोई समस्या आती है तो उपयोगकर्ता को एक त्रुटि संदेश प्रदर्शित होता है। सेलेरी वर्कर प्रलेखन से ऐसा लगता है कि मैं इसके लिए ping या inspect का उपयोग करने में सक्षम हो सकता हूं, लेकिन पिंग हैकी महसूस करता है और यह स्पष्ट नहीं है कि निरीक्षण का उपयोग कैसे किया जाता है (यदि निरीक्षण()। पंजीकृत() खाली है?)।पता लगाएं कि सेलेरी उपलब्ध है/चल रहा है

इस पर कोई मार्गदर्शन की सराहना की जाएगी।

def celery_is_alive(): 
    from celery.task.control import inspect 
    return bool(inspect().registered()) # is this right?? 

संपादित करें: मूल रूप से मैं क्या तलाश कर रहा हूँ तो जैसे एक तरीका है यह भी() पंजीकृत की तरह नहीं दिखता अजवाइन 2.3.3 (भले ही 2.1 डॉक्स यह सूची) पर उपलब्ध है। शायद पिंग सही जवाब है।

संपादित करें: पिंग भी ऐसा नहीं लगता है जो मैंने सोचा था कि ऐसा होगा, इसलिए अभी भी इसका उत्तर सुनिश्चित न करें।

+0

नहीं नीचे इस सवाल का जवाब आप के लिए काम किया? किसी ऐसे व्यक्ति के रूप में जिसने हल करने के लिए एक ही समस्या है, मुझे कुछ पुष्टि पसंद आएगी। – kojiro

उत्तर

44

यहां कोड है जिसका मैं उपयोग कर रहा हूं। celery.task.control.Inspect.stats() वर्तमान में उपलब्ध श्रमिकों के बारे में बहुत सारी जानकारी वाले एक नियम को लौटाता है, यदि कोई श्रमिक नहीं चल रहा है, या IOError उठाता है तो यह संदेश ब्रोकर से कनेक्ट नहीं हो सकता है। मैं RabbitMQ का उपयोग कर रहा हूं - यह संभव है कि अन्य संदेश सिस्टम थोड़ा अलग व्यवहार कर सकें। यह सेलेरी 2.3.x और 2.4.x में काम किया; मुझे यकीन नहीं है कि यह कितनी दूर है।

def get_celery_worker_status(): 
    ERROR_KEY = "ERROR" 
    try: 
     from celery.task.control import inspect 
     insp = inspect() 
     d = insp.stats() 
     if not d: 
      d = { ERROR_KEY: 'No running Celery workers were found.' } 
    except IOError as e: 
     from errno import errorcode 
     msg = "Error connecting to the backend: " + str(e) 
     if len(e.args) > 0 and errorcode.get(e.args[0]) == 'ECONNREFUSED': 
      msg += ' Check that the RabbitMQ server is running.' 
     d = { ERROR_KEY: msg } 
    except ImportError as e: 
     d = { ERROR_KEY: str(e)} 
    return d 
+0

मेरे लिए काम किया :) – kojiro

+6

मुझे पता चला है कि उपर्युक्त दो उत्तर.सेलरी.pidbox कतारों को हर बार चलाते समय rabbitmq में जोड़ता है। इससे खरगोश के स्मृति उपयोग में वृद्धि हुई है। – kojiro

2

मेरे लिए काम किया है:

import socket 
from kombu import Connection 

celery_broker_url = "amqp://localhost" 

try: 
    conn = Connection(celery_broker_url) 
    conn.ensure_connection(max_retries=3) 
except socket.error: 
    raise RuntimeError("Failed to connect to RabbitMQ instance at {}".format(celery_broker_url)) 
+2

मुझे पूरा यकीन है कि खरगोश की स्थिति के बावजूद खरगोश चल रहा है तो यह सफल होगा। लेकिन यह करने के लिए एक अच्छी जांच है कि क्या अजवाइन यह जानने में विफल रहता है कि विफलता खरगोश या कुछ और के साथ है या नहीं। –

4

मामले अजवाइन में एक ही का उपयोग कर कमांड लाइन डेमॉन के रूप में चल रहा है की जाँच करने के लिए,

  • सक्रिय virtualenv और dir करने के लिए जाना है, जहां 'ऐप्लिकेशन' है
  • अब चलाएँ: celery -A [app_name] status
  • यह अगर अजवाइन दिखाएगा ऊपर या नहीं प्लस संख्या है। की ऑनलाइन नोड

स्रोत: http://michal.karzynski.pl/blog/2014/05/18/setting-up-an-asynchronous-task-queue-for-django-using-celery-redis/

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