2012-02-12 13 views
31

मैं कक्षा के तरीकों का उपयोग django-celery कार्यों के रूप में करने की कोशिश कर रहा हूं, इसे @ टास्क सजावट का उपयोग करके चिह्नित कर रहा हूं। आनंद जेहर ने पूछा, उसी स्थिति को here लिखा गया है। यह समस्या भले ही मैं इस a.foo.delay(bar) यह कहते हैं की तरह वर्ग उदाहरण का उपयोग है इससेल्सरी कार्यों के रूप में कक्षा विधियों का उपयोग

class A: 
    @task 
    def foo(self, bar): 
     ... 

def main(): 
    a = A() 
    ... 
    # what i need 
    a.foo.delay(bar) # executes as celery task 
    a.foo(bar) # executes locally 

की तरह कुछ है कि foo जरूरतों को कम से कम दो तर्क है, जो meens कि self सूचक छूट जाए।

अधिक जानकारी:

  • मैं मॉड्यूल के लिए कक्षा परिवर्तित नहीं कर सकते क्योंकि विरासत का
  • तरीके दृढ़ता से वर्ग के सदस्यों पर निर्भर कर रहे हैं, तो मैं उन्हें स्थिर
  • नहीं कर सकते वर्ग को चिह्नित करने के साथ @ टास्क सजावट वाला कार्य वर्ग को एक कार्य बनाता है, और run() विधि से विधियों को निष्पादित करना संभव हो सकता है, कुछ तर्क के रूप में कुछ तर्क विधि चयन के लिए, लेकिन यह वही नहीं है जो मैं चाहता हूं।
  • वर्ग का एक उदाहरण बनाने और तरीकों के self तर्क के रूप में इसे पारित रास्ता मैं तरीकों पर अमल में परिवर्तन नहीं अजवाइन taks के रूप में, लेकिन जैसा कि सामान्य तरीकों (यानी परीक्षण करते हुए)
  • मैं कैसे पता लगाने के लिए की कोशिश की है उदाहरण के लिए मैं कन्स्ट्रक्टर से डायनामिक रूप से कार्य को पंजीकृत कर सकता हूं, लेकिन सेलेरी श्रमिकों के बीच कोड साझा करता है, इसलिए यही असंभव प्रतीत होता है।

आपकी मदद के लिए धन्यवाद!

+0

आप इसे कैसे निष्पादित करते हैं? वही उदाहरण मेरे लिए काम करता है। – asksol

+0

'ए = ए()' 'a.method (1,2)' या 'a.method.delay (1,2)' - परिणाम एक ही – eviltnan

उत्तर

40

सेलेरी के संस्करण 3.0 के बाद से विधियों का उपयोग करने के लिए प्रयोगात्मक समर्थन है।

इस के लिए दस्तावेज़ celery.contrib.methods में है, और भी कुछ चेतावनियां का उल्लेख है आप के बारे में पता होना चाहिए:

http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html

ध्यान रखें: contrib.methods के लिए समर्थन अजवाइन से हटा 4.0 के बाद से

+0

है मैंने आपकी शाखा की कोशिश की है। अद्यतन देखें। और धन्यवाद) – eviltnan

+0

भविष्य के संस्करण में इसे देखना बहुत अच्छा होगा! – ThiefMaster

+1

@TiefMaster यह वास्तव में सेलेरी 3.0 में पहले से ही है, 'celery.contrib.methods' देखें: http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html – asksol

6

जब आपके पास है:

a = A() 

आप कर सकते हैं:

A.foo.delay(a, param0, .., paramN) 

चीयर्स

1

मेरे लिए केवल एक ही है कि celery.current_app काम करता है, क्योंकि सिर्फ इस गुजरता विधि के लिए self

तो यह इस तरह दिखना चाहिए:

from celery import current_app 
from celery.contrib.methods import task_method 

class A: 
@current_app.task(filter=task_method, name='A.foo') 
def foo(self, bar): 
    ... 

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

3

जेरेमी सैटरफील्ड में कक्षा आधारित कार्यों को लिखने के लिए एक स्वच्छ और सीधा आगे ट्यूटोरियल है यदि आप यही करना चाहते हैं। आप इसे here देख सकते हैं।

जादू मूल रूप से, एक run() विधि सहित celery.Task वर्ग प्रदान कर रहा है कुछ इस तरह की तरह:

from celery import Task 

class CustomTask(Task): 
    ignore_result = True 

    def __init__(self, arg): 
     self.arg = arg 

    def run(self): 
     do_something_with_arg(self.arg) 

और उसके बाद इस तरह कार्य चलाएँ:

your_arg = 3 

custom_task = CustomTask() 
custom_task.delay(your_arg) 

मैं अगर ignore_result = True हिस्सा यकीन नहीं है आवश्यक है या बीटीडब्ल्यू नहीं है।

+0

मैंने कोशिश की, लेकिन यह काम नहीं कर रहा है, इसे फेंक रहा है त्रुटि - विशेषता त्रुटि: फ़ाइल टास्क इंस्टेंस में कोई विशेषता 'देरी' –

+0

नहीं है, आपको क्लासबेस किए गए कार्य में इनिट को ओवरराइड नहीं करना चाहिए। @ शेशमोहसिन कृपया इनिट को हटाएं और सीधे रन फ़ंक्शन डीफ़ रन (स्वयं, तर्क) में तर्क प्राप्त करें: do_something_with_arg (arg) –