2012-01-19 31 views
65

मैं दस्तावेज़ पढ़ रहा हूं और खोज रहा हूं लेकिन सीधे जवाब नहीं मिल रहा है:सेलेरी के साथ पहले से ही निष्पादित कार्य रद्द करें?

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

मैं Celery FAQ

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

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

उत्तर

116

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

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

+0

यह वही स्पष्टीकरण है जिसे मैं ढूंढ रहा था, धन्यवाद! – dcoffey3296

+0

क्या यह एक वितरित एनवी में काम करता है? मेरा मतलब है कि अगर मेरे पास कई मशीनों पर श्रमिक हैं जो कार्य निष्पादित कर रहे हैं। क्या अजवाइन का ट्रैक रहता है कि किस मशीन पर कार्य चल रहा है? – ksrini

+0

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

0

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

24

अजवाइन 3.1 में, API of revoking tasks बदल जाता है।

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

या अगर आप केवल काम आईडी:

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

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

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

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