सेलेरी के साथ पहले से ही निष्पादित कार्य रद्द करें?


96

मैं डॉक्टर को पढ़ रहा हूं और खोज रहा हूं लेकिन एक सीधा जवाब नहीं मिल रहा है:

क्या आप पहले से निष्पादित कार्य को रद्द कर सकते हैं? (जैसा कि कार्य शुरू हो गया है, इसमें कुछ समय लगता है, और इसके माध्यम से आधे रास्ते को रद्द करने की आवश्यकता होती है)

मुझे यह सेलरी अकसर किये गए सवाल पर डॉक्टर से मिला

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

लेकिन मैं स्पष्ट नहीं हूं कि क्या यह कतारबद्ध कार्यों को रद्द कर देगा या यदि यह किसी कार्यकर्ता पर चल रही प्रक्रिया को मार देगा। किसी भी प्रकाश के लिए धन्यवाद आप बहा सकते हैं!

जवाबों:


185

कार्य निष्पादन को रद्द कर देता है। यदि किसी कार्य को रद्द कर दिया जाता है, तो कर्मचारी कार्य को अनदेखा कर देते हैं और उसे निष्पादित नहीं करते हैं। यदि आप लगातार रिवाइक्स का उपयोग नहीं करते हैं तो आपके कार्य को कार्यकर्ता के पुनरारंभ के बाद निष्पादित किया जा सकता है।

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

रिवोक में एक टर्मिनेट विकल्प है जो डिफ़ॉल्ट रूप से गलत है। यदि आपको निष्पादन कार्य को पूरा करने की आवश्यकता है तो आपको True पर समाप्त करने की आवश्यकता है ।

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks


3
यह बिल्कुल वही स्पष्टीकरण है जिसकी मुझे तलाश थी, धन्यवाद!
dcoffey3296

1
क्या यह वितरित एनवी में काम करता है? मेरा मतलब है अगर मेरे पास कई मशीनें हैं जो कार्यों को निष्पादित कर रही हैं। क्या अजवाइन किस मशीन पर काम कर रही है, उस पर नज़र रखती है?
krrini

1
ऐसा होता है। श्रमिकों के साथ संचार ब्रोकर के माध्यम से होता है।
मैहर

5
result.revoke (समाप्त = सत्य) को रेवोक के रूप में एक ही कार्य करना चाहिए (कार्य_निधि, समाप्त = सत्य)
कैमहार्ट

10
हाल ही में सेलेरी डॉक्स के अनुसार, टर्मिनेशन विकल्प का उपयोग करना "प्रशासकों के लिए एक अंतिम उपाय" है। आप किसी अन्य कार्य को समाप्त करने का जोखिम चलाते हैं जो हाल ही में उस कार्यकर्ता पर शुरू हुआ है।
kouk

38

सेलेरी 3.1 में, रिवोकिंग कार्यों के एपीआई को बदल दिया जाता है।

Celery FAQ के अनुसार , आपको result.revoke का उपयोग करना चाहिए:

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

या यदि आपके पास केवल कार्य आईडी है:

>>> from proj.celery import app
>>> app.control.revoke(task_id)

25

@ 0x00mh का उत्तर सही है, हालांकि हाल ही में अजवाइन के डॉक्स का कहना है कि terminateविकल्प का उपयोग करना " प्रशासकों के लिए एक अंतिम उपाय " है क्योंकि आप गलती से किसी अन्य कार्य को समाप्त कर सकते हैं जो इस बीच निष्पादित करना शुरू कर दिया है। संभवतः एक बेहतर समाधान के terminate=Trueसाथ संयोजन किया जा रहा है signal='SIGUSR1'(जो कार्य में उठाए जाने वाले सॉफ्टटाइमलिमिटेड अपवाद को बढ़ा देता है)।


2
इस समाधान ने मेरे लिए बहुत अच्छा काम किया। जब SoftTimeLimitExceededमेरी कार्य में उठाया जाता है, अपने कस्टम सफाई तर्क (के माध्यम से कार्यान्वित try/ except/ finallyशुरू हो जाती है)। यह मेरे विचार में, AbortableTaskऑफ़र ( docs.celeryproject.org/en/latest/reference/… ) की तुलना में बहुत बेहतर है । उत्तरार्द्ध के साथ, आपको एक डेटाबेस परिणाम बैकएंड की आवश्यकता होती है और आपको यह देखना होगा कि क्या यह निरस्त किया गया है या नहीं।
डेविड श्नाइडर

2
यह कैसे बेहतर है, जहां तक ​​मैं समझता हूं कि अगर किसी अन्य कार्य को प्रक्रिया द्वारा उठाया जाता है, तो इसे वैसे भी रोक दिया जाएगा, बस अलग-अलग अपवादों को फेंक दिया जाएगा।
13

यदि मैं worker_prefetch_multiplier = 1तब से उपयोग करता हूं, जब मेरे पास कुछ लंबे समय से चल रहे कार्य हैं, तो समाप्ति ठीक होनी चाहिए - क्योंकि समाप्त होने से कोई अन्य कार्य प्रभावित नहीं होंगे - क्या मुझे यह सही लगा? @spicyramen
माफ़

1

कार्यों के लिए निम्न विकल्प देखें: time_limit , soft_time_limit (या आप इसे श्रमिकों के लिए सेट कर सकते हैं)। आप न केवल निष्पादन के समय को नियंत्रित करना चाहते हैं, तो देखने के समाप्त हो रहा है apply_async विधि का तर्क।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.