2012-04-09 15 views
5

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

[program:celeryd1] 
command=/path/to/celeryd --pool=solo --queues=queue1 
... 

[program:celeryd2] 
command=/path/to/celeryd --pool=solo --queues=queue2 
... 

और मेरे celeryconfig इस तरह दिखता है:

from celery.schedules import crontab 

BROKER_URL = "amqp://guest:[email protected]:5672//" 

CELERY_DISABLE_RATE_LIMITS = True 
CELERYD_CONCURRENCY = 1 
CELERY_IGNORE_RESULT = True 

CELERY_DEFAULT_QUEUE = 'default' 
CELERY_QUEUES = { 
    'default': { 
     "exchange": "default", 
     "binding_key": "default", 
    }, 
    'queue1': { 
     'exchange': 'queue1', 
     'routing_key': 'queue1', 
    }, 
    'queue2': { 
     'exchange': 'queue2', 
     'routing_key': 'queue2', 
    }, 
} 

CELERY_IMPORTS = ('tasks',) 

CELERYBEAT_SCHEDULE = { 
    'first-queue': { 
     'task': 'tasks.sync', 
     'schedule': crontab(hour=02, minute=00), 
     'kwargs': {'client': 'client_1'}, 
     'options': {'queue': 'queue1'}, 
    }, 
    'second-queue': { 
     'task': 'tasks.sync', 
     'schedule': crontab(hour=02, minute=00), 
     'kwargs': {'client': 'client_2'}, 
     'options': {'queue': 'queue1'}, 
    }, 
} 

सभी tasks.sync कार्य एक विशिष्ट कतार (और इसलिए celeryd प्रगति) के लिए कराई जानी चाहिए। लेकिन जब मैं sync.apply_async(kwargs={'client': 'value'}, queue='queue1') के साथ मैन्युअल रूप से कार्य को चलाने का प्रयास करता हूं तो दोनों अजवाइन कर्मचारी कार्य को उठाते हैं। मैं सही कतार में कार्य मार्ग कैसे बना सकता हूं और केवल उस कार्यकर्ता द्वारा चलाया जा सकता है जो कतार से बंधे हैं?

उत्तर

6

आप केवल एक सेलेरीबीट उदाहरण चला रहे हैं?

हो सकता है कि आपके पास पुरानी कतार बाइंडिंग है जो इसके साथ संघर्ष करती है? rabbitmqctl list_queues और rabbitmqctl list_bindings, चलाने का प्रयास करें शायद ब्रोकर में डेटा को स्क्रैच से शुरू करने के लिए रीसेट करें।

आपके यहां उदाहरण का काम करना चाहिए, और जब मैंने अभी कोशिश की तो मेरे लिए काम कर रहा है।

युक्ति: चूंकि आप कतार नाम के रूप में एक ही एक्सचेंज और बाइंडिंग_की मान का उपयोग कर रहे हैं, आपको उन्हें CELERY_QUEUES में स्पष्ट रूप से सूचीबद्ध करने की आवश्यकता नहीं है। जब CELERY_CREATE_MISSING_QUEUES चालू है (जो डिफ़ॉल्ट रूप से है) तो कतार स्वचालित रूप से बनाई जाएगी जैसे कि आपके पास है यदि आप केवल celeryd -Q queue1 करते हैं या एक कतार में एक कार्य भेजते हैं जो अपरिभाषित है।