का हिस्सा हैं मेरे पास एक सेलेरी श्रृंखला है जो कुछ कार्य चलाती है। प्रत्येक कार्य विफल हो सकता है और पुनः प्रयास किया जा सकता है। कृपया एक त्वरित उदाहरण के लिए नीचे देखें:सेलेरी को पुनः प्रयास करना विफल रहा कार्य जो चेन
from celery import task
@task(ignore_result=True)
def add(x, y, fail=True):
try:
if fail:
raise Exception('Ugly exception.')
print '%d + %d = %d' % (x, y, x+y)
except Exception as e:
raise add.retry(args=(x, y, False), exc=e, countdown=10)
@task(ignore_result=True)
def mul(x, y):
print '%d * %d = %d' % (x, y, x*y)
और श्रृंखला:
from celery.canvas import chain
chain(add.si(1, 2), mul.si(3, 4)).apply_async()
दो कार्य चल रहा है (और यह सोचते हैं कि कुछ भी नहीं विफल रहता है), आपके हो/मुद्रित देखेंगे:
1 + 2 = 3
3 * 4 = 12
हालांकि, जब ऐड कार्य पहली बार विफल रहता है और बाद में पुनः प्रयास कॉल में सफल होता है, तो चेन में शेष कार्य नहीं चलते हैं, यानी कार्य कार्य विफल रहता है, श्रृंखला में अन्य सभी कार्य नहीं चलते हैं और बाद में ईड सेकेंड, ऐड टास्क फिर से चलाता है और सफल होता है और चेन में शेष कार्य (इस मामले में mul.si (3, 4)) नहीं चलता है।
क्या अजवाइन उस कार्य से असफल श्रृंखला जारी रखने का एक तरीका प्रदान करता है जो बाद में विफल रहा? यदि नहीं, तो इसे पूरा करने के लिए सबसे अच्छा तरीका क्या होगा और यह सुनिश्चित कर लें कि एक श्रृंखला के कार्य निर्दिष्ट क्रम में चलते हैं और केवल पिछले कार्य के बाद सफलतापूर्वक निष्पादित किया गया है, भले ही कार्य को कुछ बार पुनः प्रयास किया जाए?
नोट 1: मुद्दा
add.delay(1, 2).get()
mul.delay(3, 4).get()
करके हल किया जा सकता है, लेकिन मैं समझ क्यों जंजीरों में विफल रहा कार्यों के साथ काम नहीं करते में दिलचस्पी है।
मैंने एक श्रृंखला-जैसे कार्य का उपयोग करने का निर्णय लिया जो अन्य कार्यों को चलाता है जो अन्यथा एक श्रृंखला में होते हैं, लेकिन दूसरे को शुरू करने से पहले एक कार्य पूरा करने की प्रतीक्षा करते हैं, उदाहरण के लिए: 'task1.delay ([params])। प्राप्त(); । Task2.delay ([पैरामीटर]) मिलता है(); task3.delay ([पैरामीटर])। मिलता है() '। चेन-जैसे कार्य किसी भी कार्य द्वारा उठाए गए अपवादों को पकड़ सकता है और खुद को पुनः प्रयास कर सकता है। – Andrei
तो आपके उदाहरण से, टी 1 ई और टी 2 को टी 2 और क्रमशः टी 3, कॉल करना होगा? – Andrei
उदाहरण के लिए चेन के लिए संभावित वाक्यविन्यास पर सिर्फ मेरे विचार। इसका मतलब है कि प्रत्येक अगला कार्य वास्तव में कार्यों की जोड़ी है, जोड़ी में पहला तत्व कॉल किया जाएगा यदि पिछले चरण में कोई अपवाद/त्रुटि नहीं होती है, और दूसरा तत्व पिछले चरण की विफलता के लिए अपवाद/त्रुटि हैंडलर है। 't1e' मतलब 't1 त्रुटि हैंडलर' – anh