2013-02-19 50 views
9

जब मैं मार्ग एक विशेष कतार यह काम करता है के लिए एक कार्य:सेलेरी में एक विशिष्ट कतार में कार्यों की एक श्रृंखला को कैसे रूट किया जाए?

task.apply_async(queue='beetroot') 

लेकिन अगर मैं एक श्रृंखला बनाने के लिए:

chain = task | task 

और फिर मैं लिखना

chain.apply_async(queue='beetroot') 

यह अनदेखी करने के लिए लगता है कतार कीवर्ड और डिफ़ॉल्ट 'अजवाइन' कतार को असाइन करता है।

यह अच्छा होगा यदि अजवाइन समर्थित जंजीरों में मार्ग हो सकता है - सभी कार्य एक ही कतार में क्रमिक रूप से मार डाला।

उत्तर

10

ठीक है, मैं इस एक पता लगा मिला है।

उपकार्य परिभाषा:

from celery import subtask 

chain = subtask('task', queue = 'beetroot') | subtask('task', queue = 'beetroot') 

आंशिक:

chain = task.s().apply_async(queue = 'beetroot') | task.s().apply_async(queue = 'beetroot') 

आप = कतार = या उलटी गिनती की तरह आवश्यक निष्पादन विकल्प जोड़ने के लिए उपकार्य परिभाषा करने के लिए, या एक आंशिक के माध्यम से है

chain.apply_async() 
:

तो फिर तुम के माध्यम से श्रृंखला पर अमल

या,

chain.delay() 

और कार्य 'चुकंदर' कतार में भेजा जाएगा। इस अंतिम कमांड में अतिरिक्त निष्पादन तर्क कुछ भी नहीं करेंगे। यह चेन (या समूह, या किसी अन्य कैनवास पुरातन) के स्तर पर उन निष्पादन सभी तर्क लागू करने के लिए किया गया है एक तरह से अच्छा होगा।

+2

हममम, कि आंशिक उदाहरण मेरे लिए काम नहीं किया, मैं वापस निम्न त्रुटि मिला और 'AsyncResult' (3.0 का उपयोग कर।23) – Clara

+0

मुझे दूसरे कार्य को निष्पादित करने के लिए 'चेन' प्राप्त करने की कोशिश में अपने आप के मुद्दे थे। प्रश्न: यदि आप दोनों कार्यों पर 'apply_async' को कॉल कर रहे हैं, तो क्या वास्तव में यह एक श्रृंखला है? क्या दोनों कार्य अपने स्वयं के समझौते को निष्पादित नहीं करेंगे? मैंने आपके वाक्यविन्यास को आजमाया और यह असफल रहा क्योंकि मेरे मामले में पहला उपटस्क एक मान देता है जो दूसरे द्वारा उपयोग किया जाता है। – PritishC

12

मैं इस तरह यह कार्य करें:

subtask = task.s(*myargs, **mykwargs).set(queue=myqueue) 
mychain = celery.chain(subtask, subtask2, ...) 
mychain.apply_async() 
+0

तो यह काम करता है अगर हस्ताक्षर पर 'कतार' निर्दिष्ट है, लेकिन जब यह 'apply_async' को पास नहीं किया जाता है? क्या आपको पता है कि इस सुविधा के लिए कुछ अच्छा दस्तावेज है या नहीं? – dashesy

+0

एक ही श्रृंखला में अलग-अलग उप-कार्य अलग-अलग कतारों को आवंटित किया जा सकता है? – ForeverWintr

3

यह नहीं बल्कि देर हो चुकी है, लेकिन मुझे नहीं लगता @mpaf द्वारा प्रदान की कोड पूरी तरह से सही है।

प्रसंग: मेरे मामले में, मैं दो उप-कार्य पहले जिनमें से एक वापसी मान जो इनपुट तर्क के रूप में दूसरे को दिया जाता है प्रदान करता है,। मैं निष्पादित करने के लिए दूसरा काम प्राप्त करने में परेशानी हो रही थी - मैं लॉग अजवाइन पहले की एक कॉलबैक के रूप में दूसरा काम स्वीकार करते हैं में देखा था, लेकिन यह दूसरे पर अमल कभी नहीं होगा।

यह मेरा गैर काम कर रहे श्रृंखला कोड था -:

from celery import chain 

chain(
    module.task1.s(arg), 
    module.task2.s() 
).apply_async(countdown=0.1, queue='queuename') 

@ mpaf के जवाब में प्रदान की वाक्य रचना का उपयोग करना, मैं दोनों कार्यों को निष्पादित करने के लिए मिल गया है, लेकिन निष्पादन आदेश बेतरतीब था और दूसरा उपकार्य स्वीकार नहीं किया गया था पहले के कॉलबैक के रूप में। मुझे एक उप-कार्य पर कतार को स्पष्ट रूप से सेट करने के तरीके पर दस्तावेज़ों को ब्राउज़ करने का विचार मिला। 'AsyncResult': | -

यह काम कर कोड है: का समर्थन नहीं संकार्य प्रकार (ओं): लेखन त्रुटि:

chain(
    module.task1.s(arg).set(queue='queuename'), 
    module.task2.s().set(queue='queuename') 
).apply_async(countdown=0.1) 
+0

मेरे लिए काम किया – phacic