2011-03-28 19 views
33

मेरे पास 2 प्रकार के कार्य हैं: टाइप 1 - कुछ उच्च प्राथमिकता वाले छोटे कार्यों में से कुछ। टाइप 2 - कम प्राथमिकता वाले भारी कार्यों के बहुत सारे।सेलेरी - एक सर्वर पर विभिन्न श्रमिकों को चलाएं

प्रारंभ में मेरे पास डिफ़ॉल्ट रूटिंग के साथ सरल कॉन्फ़िगरेशन था, कोई रूटिंग कुंजी का उपयोग नहीं किया गया था। यह पर्याप्त नहीं था - कभी-कभी सभी कर्मचारी टाइप 2 कार्य के साथ व्यस्त थे, इसलिए कार्य 1 में देरी हुई थी। मैं जोड़ दिया है रूटिंग कुंजियों: - उच्च और निम्न प्राथमिकता वाले कार्यों के साथ

CELERY_DEFAULT_QUEUE = "default" 
CELERY_QUEUES = { 
    "default": { 
     "binding_key": "task.#", 
    }, 
    "highs": { 
     "binding_key": "starter.#", 
    }, 
} 
CELERY_DEFAULT_EXCHANGE = "tasks" 
CELERY_DEFAULT_EXCHANGE_TYPE = "topic" 
CELERY_DEFAULT_ROUTING_KEY = "task.default" 

CELERY_ROUTES = { 
     "search.starter.start": { 
      "queue": "highs", 
      "routing_key": "starter.starter", 
     }, 
} 

तो अब मैं 2 कतारों की है।

समस्या - विभिन्न concurrency सेटिंग्स के साथ 2 celeryd कैसे शुरू करें?

पहले अजवाइन डेमॉन मोड में इस्तेमाल किया गया था (अनुसार to this), /etc/init.d/celeryd start की तो केवल शुरुआत की जरूरत थी, लेकिन अब मैं अलग कतारों और संगामिति के साथ 2 अलग celeryds चलाने के लिए है। मैं यह कैसे कर सकता हूं?

उत्तर

31

ऐसा लगता है कि उत्तर - अजवाइन-बहु - वर्तमान में अच्छी तरह से प्रलेखित नहीं है।

मैं निम्न आदेश द्वारा किया जा सकता क्या जरूरत:

celeryd-multi start 2 -Q:1 default -Q:2 starters -c:1 5 -c:2 3 --loglevel=INFO --pidfile=/var/run/celery/${USER}%n.pid --logfile=/var/log/celeryd.${USER}%n.log 

हम क्या करते हैं 2 श्रमिकों, जो अलग अलग कतारों सुन रहे हैं शुरू कर रहा है (-Q: 1 डिफ़ॉल्ट, क्यू है: 2 शुरुआत है) साथ विभिन्न concurrencies -c: 1 से 5 -c: जो काम करता है: 2 3

+0

मैं कैसे निर्दिष्ट कर सकते हैं श्रमिकों नाम ?? – holms

34

ऊपर जवाब के आधार पर, मैं निम्नलिखित/etc/default/celeryd फ़ाइल (http://ask.github.com/celery/cookbook/daemonizing.html मूल विन्यास डॉक्स यहाँ में वर्णित के आधार पर) तैयार एक ही मशीन पर दो अजवाइन श्रमिकों को चलाने के लिए, प्रत्येक कार्यकर्ता एक अलग कतार की सेवा करता है (इस मामले में कतार के नाम "डिफ़ॉल्ट" और "महत्वपूर्ण" होते हैं)।

असल में यह उत्तर केवल पिछले उत्तर का एक विस्तार है जिसमें यह दिखाता है कि यह वही काम कैसे करता है, लेकिन डेमॉन मोड में अजवाइन के लिए। कृपया ध्यान दें कि हम Django-अजवाइन यहाँ का उपयोग कर रहे:

CELERYD_NODES="w1 w2" 

# Where to chdir at start. 
CELERYD_CHDIR="/home/peedee/projects/myproject/myproject" 

# Python interpreter from environment. 
#ENV_PYTHON="$CELERYD_CHDIR/env/bin/python" 
ENV_PYTHON="/home/peedee/projects/myproject/myproject-env/bin/python" 

# How to call "manage.py celeryd_multi" 
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi" 

# How to call "manage.py celeryctl" 
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl" 

# Extra arguments to celeryd 
# Longest task: 10 hrs (as of writing this, the UpdateQuanitites task takes 5.5 hrs) 
CELERYD_OPTS="-Q:w1 default -c:w1 2 -Q:w2 important -c:w2 2 --time-limit=36000 -E" 

# Name of the celery config module. 
CELERY_CONFIG_MODULE="celeryconfig" 

# %n will be replaced with the nodename. 
CELERYD_LOG_FILE="/var/log/celery/celeryd.log" 
CELERYD_PID_FILE="/var/run/celery/%n.pid" 

# Name of the projects settings module. 
export DJANGO_SETTINGS_MODULE="settings" 

# celerycam configuration 
CELERYEV_CAM="djcelery.snapshot.Camera" 
CELERYEV="$ENV_PYTHON $CELERYD_CHDIR/manage.py celerycam" 
CELERYEV_LOG_FILE="/var/log/celery/celerycam.log" 

# Where to chdir at start. 
CELERYBEAT_CHDIR="/home/peedee/projects/cottonon/cottonon" 

# Path to celerybeat 
CELERYBEAT="$ENV_PYTHON $CELERYBEAT_CHDIR/manage.py celerybeat" 

# Extra arguments to celerybeat. This is a file that will get 
# created for scheduled tasks. It's generated automatically 
# when Celerybeat starts. 
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule" 

# Log level. Can be one of DEBUG, INFO, WARNING, ERROR or CRITICAL. 
CELERYBEAT_LOG_LEVEL="INFO" 

# Log file locations 
CELERYBEAT_LOGFILE="/var/log/celerybeat.log" 
CELERYBEAT_PIDFILE="/var/run/celerybeat.pid" 
+0

धन्यवाद! यह बहुत उपयोगी था। – Jacinda

+0

आपने अभी पूरे जीवन में अपना जीवन बचाया है, इस जानवर की पूर्ण उचित कॉन्फ़िगरेशन ढूंढना बहुत मुश्किल है। आपको ब्लॉग लेख बनाना होगा, हजारों खुश होंगे! – holms

11

एक अन्य विकल्प कार्यकर्ता प्रक्रिया का एक अलग नाम दे रहा है - -n तर्क का उपयोग।

मेरे पास दो भौतिक हार्डवेयर पर चल रहे दो पिरामिड ऐप्स हैं, जिनमें से प्रत्येक अपने स्वयं के अजवाइन उदाहरण (अपने स्वयं के वर्चुअलएन्ड्स के भीतर) है।

दोनों में पर्यवेक्षक दोनों अद्वितीय पर्यवेक्षक.कॉन्फ़ फ़ाइल के साथ दोनों को नियंत्रित करते हैं।

APP1:

[program:celery]            
autorestart=true            
command=%(here)s/../bin/celery worker -n ${HOST}.app1--app=app1.queue -l debug 
directory=%(here)s  

[2013-12-27 10:36:24,084: WARNING/MainProcess] [email protected] ready. 

APP2:

[program:celery]         
autorestart=true         
command=%(here)s/../bin/celery worker -n ${HOST}.app2 --app=app2.queue -l debug 
directory=%(here)s        

[2013-12-27 10:35:20,037: WARNING/MainProcess] [email protected] ready. 
+0

मैं ऐसा कुछ करना चाहता हूं जहां मेरे पास एकाधिक कार्यकर्ता उदाहरण हैं। मैंने रूटिंग कार्य पृष्ठ को पढ़ने की कोशिश की है, लेकिन समझ में नहीं आता है। आप कार्यों को प्रत्येक विशेष कार्यकर्ता को कैसे रूट करते हैं? – Raj

+0

कार्य स्वचालित रूप से सही कार्यकर्ता को रूट करते हैं क्योंकि 'माज़' के लिए श्रमिक एक वर्चुअल वातावरण में होते हैं और 'घड़ी के कार्य' के लिए श्रमिक दूसरे वर्चुअल वातावरण में होते हैं। – maz

+0

मुझे लगता है कि यह सेटअप काम कर सकता है अगर मैं दोनों उदाहरणों को एक ही कतार से खींचना चाहता हूं? – ChrisC

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