2011-11-22 11 views
7

में आवधिक कार्य रोकना/पर्जिंग करना मैंने आवधिक कार्य को आवर्तित करके डीजेंगो-सेलेरी में काम करने के लिए आवधिक कार्य प्राप्त करने में कामयाब रहे हैं। मैंने एक परीक्षण कार्य बनाने की कोशिश की और इसे कुछ बेकार करने के लिए सेट किया। यह काम करता हैं।Django-Celery

अब मैं इसे रोक नहीं सकता। मैंने प्रलेखन पढ़ा है और मुझे निष्पादन कतार से कार्य को हटाने का तरीका नहीं पता है। मैंने celeryctl का उपयोग करने और खोल का उपयोग करने का प्रयास किया है, लेकिन रजिस्ट्री.tasks() खाली है, इसलिए मैं इसे हटाने के तरीके को नहीं देख सकता।

मैंने सुझाव देखा है कि मुझे इसे "निरस्त करना" चाहिए, लेकिन इसके लिए मुझे एक कार्य आईडी की आवश्यकता है, और मैं नहीं देख सकता कि मुझे कार्य आईडी कैसे मिलेगी।

धन्यवाद।

उत्तर

21

एक कार्य एक संदेश है, और एक "आवधिक कार्य" आवधिक अंतराल पर कार्य संदेश भेजता है। भेजे गए प्रत्येक कार्य में एक अनन्य आईडी होगी जो इसे सौंपी जाएगी।

revoke केवल एक ही कार्य संदेश रद्द कर देगा। किसी कार्य के लिए आईडी प्राप्त करने के लिए आपको आईडी भेजने का ट्रैक रखना होगा, लेकिन जब आप कोई कार्य भेजते हैं तो आप एक कस्टम आईडी भी निर्दिष्ट कर सकते हैं।

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

आवधिक कार्य, लेकिन आप समय-समय पर कार्य के नाम के प्रत्येक कार्य के लिए आईडी सेट कर सकते हैं के साथ भेजा किसी कार्य के आईडी रखने के लिए कोई अंतर्निहित तरह से, कि जिस तरह से आईडी किसी भी उल्लेख करेंगे नहीं है आवधिक कार्य (आमतौर पर अंतिम एक) के साथ भेजा गया कार्य। आप एक कस्टम आईडी, इस तरह से निर्दिष्ट कर सकते हैं

या तो @periodic_task डेकोरेटर के साथ:

@periodic_task(options={"task_id": "my_periodic_task"}) 
def my_periodic_task(): 
    pass 

या CELERYBEAT_SCHEDULE सेटिंग के साथ:

CELERYBEAT_SCHEDULE = {name: {"task": task_name, 
           "options": {"task_id": name}}} 

आप बस एक आवधिक कार्य आप निकालना चाहते हैं कोडबेस से @periodic_task हटाएं, या CELERYBEAT_SCHEDULE से प्रविष्टि को हटा दें। यदि आप Django डेटाबेस शेड्यूलर का उपयोग कर रहे हैं तो आपको Django Admin इंटरफ़ेस से आवधिक कार्य को निकालना होगा।

PS1: revoke कोई कार्य शुरू नहीं किया गया है जो पहले ही शुरू हो चुका है। यह केवल कार्यों को रद्द करता है जो अभी तक शुरू नहीं हुए हैं। आप revoke(task_id, terminate=True) का उपयोग कर एक चल रहे कार्य को समाप्त कर सकते हैं। डिफ़ॉल्ट रूप से यह TERM सिग्नल प्रक्रिया को भेज देगा, यदि आप एक और सिग्नल भेजना चाहते हैं (उदा। किल) revoke(task_id, terminate=True, signal="KILL") का उपयोग करें।

पीएस 2: निरस्त रिमोट कंट्रोल कमांड है इसलिए इसे केवल RabbitMQ और रेडिस ब्रोकर ट्रांसपोर्ट द्वारा समर्थित किया जाता है। आप अपने काम के लिए एक डेटाबेस में एक cancelled झंडा भंडारण के द्वारा रद्द आप ऐसा करना चाहिए समर्थन करना चाहते हैं और काम है कि झंडा जाँच जब यह शुरू होता है है, तो:

from celery.task import Task 

class RevokeableTask(Task): 
    """Task that can be revoked. 

    Example usage: 

     @task(base=RevokeableTask) 
     def mytask(): 
      pass 
    """ 

    def __call__(self, *args, **kwargs): 
     if revoke_flag_set_in_db_for(self.request.id): 
      return 
     super(RevokeableTask, self).__call__(*args, **kwargs) 
+0

इस बेहद गहन उत्तर के लिए धन्यवाद। –

3

शायद ज़रुरत पड़े इस किसी की मदद कर सकते हैं ... हमें काम पर एक ही समस्या थी, और आवधिक कार्य को हटाने के लिए किसी प्रकार के प्रबंधन कमांड को खोजने के कुछ प्रयासों को तुच्छ मानता था, हम नहीं कर सके। तो यहां कुछ पॉइंटर्स हैं।

आपको शायद पहले 0 -का उपयोग करके डबल-चेक करना चाहिए।

डिफ़ॉल्ट शेड्यूलर celery.beat.PersistentScheduler है, जो स्थानीय डेटाबेस फ़ाइल (शेल्व) में अंतिम रन टाइम का ट्रैक रख रहा है।

हमारे मामले में, हम djcelery.schedulers.DatabaseScheduler वर्ग इस्तेमाल कर रहे थे। का उपयोग करते हुए

: एक अनुसूचक कि Django डेटाबेस

में अनुसूची संग्रहीत करता है हालांकि प्रलेखन आवधिक कार्यों को निकालने के लिए एक रास्ता उल्लेख करता है के साथ

Django-अजवाइन भी जहाजों django-celery का शेड्यूलर आप Django व्यवस्थापक से आवधिक कार्यों को जोड़, संशोधित और हटा सकते हैं।

हम प्रोग्राम को स्वचालित रूप से हटाने या एक खोल में (सेलरी/प्रबंधन) कमांड के माध्यम से निष्पादित करना चाहते थे।

जब से हम एक कमांड लाइन नहीं पा सके, हम Django/अजगर खोल इस्तेमाल किया:

$ python manage.py shell 
>>> from djcelery.models import PeriodicTask 
>>> pt = PeriodicTask.objects.get(name='the_task_name') 
>>> pt.delete() 

मुझे आशा है कि इस मदद करता है!

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