2012-08-09 15 views
8

मैं एक कार्य को कॉल करने की कोशिश कर रहा हूं और उस कार्य के लिए कतार बना रहा हूं यदि यह अस्तित्व में नहीं है तो तुरंत उस कतार में बुलाए गए कार्य को सम्मिलित करें।सेलेरी गतिशील कतार निर्माण और रूटिंग

@task 
def greet(name): 
    return "Hello %s!" % name 


def run(): 
    result = greet.delay(args=['marc'], queue='greet.1', 
     routing_key='greet.1') 
    print result.ready() 

तो मैं एक कस्टम रूटर है:

class MyRouter(object): 

    def route_for_task(self, task, args=None, kwargs=None): 
     if task == 'tasks.greet': 
      return {'queue': kwargs['queue'], 
        'exchange': 'greet', 
        'exchange_type': 'direct', 
        'routing_key': kwargs['routing_key']} 
     return None 

इस एक मुद्रा greet.1 कहा जाता है और एक कतार greet.1 कहा जाता है लेकिन कतार खाली है बनाता है मैं निम्नलिखित कोड है। एक्सचेंज को केवल greet कहा जाना चाहिए जो greet.1 जैसे greet.1 नामक कतार में रूटिंग कुंजी को रूट करने के बारे में जानता है।

कोई विचार?

उत्तर

13

आप निम्न कर जब:

task.apply_async(queue='foo', routing_key='foobar') 

तब अजवाइन CELERY_QUEUES, में 'foo' कतार से मूलभूत मूल्यों ले जाएगा या अगर यह तो मौजूद नहीं है स्वचालित रूप से (कतार = foo, विनिमय का उपयोग कर इसे बनाने = foo, routing_key = foo)

तो अगर 'foo' CELERY_QUEUES में मौजूद नहीं है आप के साथ खत्म हो जाएगा:

queues['foo'] = Queue('foo', exchange=Exchange('foo'), routing_key='foo') 

निर्माता तो घोषणा करेंगे कि कतार, लेकिन जब से तुम routing_key ओवरराइड, वास्तव में संदेश routing_key = 'foobar'

का उपयोग कर यह अजीब लग सकता है लेकिन भेज व्यवहार वास्तव में विषय आदान-प्रदान, जहां विभिन्न विषयों पर प्रकाशित लिए उपयोगी है।

हालांकि आप जो चाहते हैं उसे करना कठिन है, आप स्वयं को कतार बना सकते हैं और इसे घोषित कर सकते हैं, लेकिन यह स्वचालित संदेश प्रकाशित रीट्रीज़ के साथ अच्छी तरह से काम नहीं करेगा। यह बेहतर होगा अगर कतार तर्क लागू करने के लिए एक कस्टम kombu.Queue का समर्थन करता है, जिसे दोनों घोषित और गंतव्य के रूप में उपयोग किया जाएगा। हो सकता है कि आप http://github.com/celery/celery/issues

+0

पर मैन्युअल रूप से कतार बनाने के बारे में चिंता करना बंद कर दिया हो, तो बस एक नया कार्यकर्ता उत्पन्न करें जो कतार बनाता है और स्वचालित रूप से आदान-प्रदान करता है जो मेरी समस्या के लिए अधिक समझ में आता है। हमेशा के रूप में, उत्तर के लिए धन्यवाद। :) – Marconi

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