Celery: إبطال / إحباط المهام عند إغلاق العامل

تم إنشاؤها على ٢٤ فبراير ٢٠١٦  ·  3تعليقات  ·  مصدر: celery/celery

أنا أستخدم 3.1.20 (وسيط Redis وخلفية) وأود طريقة لإلغاء / إبطال المهام قيد التشغيل حاليًا عندما يتم إيقاف تشغيل العامل.
النقطة المهمة هي وضع علامة "فشل" إذا أمكن على المهام ، وعدم إعادة تشغيلها في المرة التالية التي يبدأ فيها العامل مرة أخرى.

أقوم بتشغيل مهمة واحدة في كل مرة وبما أن المهمة لها آثار جانبية (ولا يمكنني تغيير ذلك) ، فإن قتل العامل سيكون سلوك المستخدم المتوقع عندما يحدث خطأ ما ، ولا أريد إعادة المهمة بعد ذلك الوقت الذي أبدأ فيه العامل (أعتقد أن سلوك المتعامل الافتراضي هو ...)

لقد حاولت http://stackoverflow.com/a/8230470 ولكن دون جدوى.
وجربت أيضًا بعض الأشياء باستخدام واجهة التحكم أو العامل من bootstep:

from celery import Celery, bootsteps
from celery.task.control import revoke

# TODO : configuration for tests...
class BootPyrosNode(bootsteps.StartStopStep):

    def __init__(self, worker, **kwargs):
        logging.warn('{0!r} is starting from {1}'.format(worker, __file__))

        [...]

    def create(self, worker):
        return self

    def start(self, worker):
        # our step is started together with all other Worker/Consumer
        # bootsteps.
        pass  # not sure in which process this is run.

    def stop(self, worker):
        # the Consumer calls stop every time the consumer is restarted
        # (i.e. connection is lost) and also at shutdown.  The Worker
        # will call stop at shutdown only.
        logging.warn('{0!r} is stopping. Attempting abort of current tasks...'.format(worker))
        for req in worker.state.active_requests:
            # worker.app.control.revoke(req.id, terminate=True) # not working
            # revoke(req.id, terminate=True) # not working
        self.node_proc.shutdown()

مثبتة بهذه الطريقة:

celeros_app = Celery()

# setting up custom bootstep to start ROS node and pass ROS arguments to it
celeros_app.steps['worker'].add(BootPyrosNode)
celeros_app.user_options['worker'].add(Option('-R', '--ros-arg', action="append", help='Arguments for ros initialisation'))

ومع ذلك ، يبدو أنه لا يمكن إبطال / إلغاء مهمتي ، (ربما بسبب عدم معالجة العامل لرسائل التحكم بعد التوقف؟) ونفاد الأفكار.

إذا كنت تريد رؤية المزيد ، فإن الكود يأتي من: https://github.com/asmodehn/celeros.

هل هناك طريقة أم أن هذا التخصيص غير ممكن بعد؟

Feature Request

التعليق الأكثر فائدة

شكرا !
تمكنت من إلغاء مهام قيد التشغيل عند إيقاف تشغيل العمال. :

def stop(self, worker):
        # the Consumer calls stop every time the consumer is restarted
        # (i.e. connection is lost) and also at shutdown.  The Worker
        # will call stop at shutdown only.
        logging.warn('{0!r} is stopping. Attempting termination of current tasks...'.format(worker))

        # Following code from worker.control.revoke

        task_ids = []
        terminated = set()

        # cleaning all reserved tasks since we are shutting down
        signum = _signals.signum('TERM')
        for request in [r for r in worker.state.reserved_requests]:
            if request.id not in terminated:
                task_ids.append(request.id)
                terminated.add(request.id)
                logger.info('Terminating %s (%s)', request.id, signum)
                request.terminate(worker.pool, signal=signum)

        # Aborting currently running tasks, and triggering soft timeout exception to allow task to clean up.
        signum = _signals.signum('USR1')
        for request in [r for r in worker.state.active_requests]:
            if request.id not in terminated:
                task_ids.append(request.id)
                terminated.add(request.id)
                logger.info('Terminating %s (%s)', request.id, signum)
                request.terminate(worker.pool, signal=signum)  # triggering SoftTimeoutException in Task

        if terminated:
            terminatedstr = ', '.join(task_ids)
            logger.info('Tasks flagged as revoked: %s', terminatedstr)

        self.node_proc.shutdown()

أولاً ، ألغيت المهمة الموجودة في قائمة الطلبات المحجوزة لمنع تولي مهمة الانتظار قبل إيقاف التشغيل مباشرة.

ثم ألغيت الطلب النشط ، ثم أقوم بتشغيل استثناء SoftTimeLimitExceeded في المهمة لأتمكن من تشغيل سلوك التنظيف في المهمة. نظرًا لأنني أستخدم acks_late (لتشغيل مهمة واحدة فقط في كل مرة) ، فأنا بحاجة إلى العودة أو رفع المهمة من أجل الاعتراف بها بشكل صحيح وعدم إعادة تشغيلها في المرة القادمة التي أقوم فيها بتشغيل العامل.

أنا أستخدم مهامًا قابلة للإجهاض ، ولكن يتم ترميز سلوك الإحباط عندما يريد المستخدم إجهاض مهمة عن قصد ، ويحتاج النظام إلى إجراء بعض عمليات التنظيف المعقدة / الطويلة. هذه الحالة أشبه بإغلاق العامل ، وفي هذه الحالة أريد أن أجعل المهمة الحالية تفشل بسرعة.

أعتقد أن هذه ستكون طريقة مناسبة لعمل الأشياء في الكرفس؟

في إصدار مستقبلي سيكون من الجيد أن تكون قادرًا ببساطة على إعادة تعريف السلوك في فئة المهام ... على سبيل المثال زيادة التحميل على طريقة on_revoke () أو on_abort (). وربّما طريقة لتعدد السلوك عند الإبطال ، حسب بعض الشروط ...
فقط سنتان ، لم أقم بفحص الإصدار 4.0 من الكرفس بعد.

ال 3 كومينتر

لا يمكنك إرسال أوامر التحكم عن بعد إلى نفسك أثناء إيقاف التشغيل ، فأنت بحاجة إلى إلغاء المهام باستخدام العناصر الداخلية للعمال (انظر كيف يتم تنفيذ أمر التحكم عن بعد في الكرفس / العامل / التحكم. py).

ربما يجب أن تتأكد أيضًا من أن خطوتك التمهيدية تعتمد على التجمع ، بحيث يتم استدعاء طريقة stop() أولاً أثناء إيقاف التشغيل:

class Step..:
    requires = ('celery.worker.components:Pool',)

شكرا !
تمكنت من إلغاء مهام قيد التشغيل عند إيقاف تشغيل العمال. :

def stop(self, worker):
        # the Consumer calls stop every time the consumer is restarted
        # (i.e. connection is lost) and also at shutdown.  The Worker
        # will call stop at shutdown only.
        logging.warn('{0!r} is stopping. Attempting termination of current tasks...'.format(worker))

        # Following code from worker.control.revoke

        task_ids = []
        terminated = set()

        # cleaning all reserved tasks since we are shutting down
        signum = _signals.signum('TERM')
        for request in [r for r in worker.state.reserved_requests]:
            if request.id not in terminated:
                task_ids.append(request.id)
                terminated.add(request.id)
                logger.info('Terminating %s (%s)', request.id, signum)
                request.terminate(worker.pool, signal=signum)

        # Aborting currently running tasks, and triggering soft timeout exception to allow task to clean up.
        signum = _signals.signum('USR1')
        for request in [r for r in worker.state.active_requests]:
            if request.id not in terminated:
                task_ids.append(request.id)
                terminated.add(request.id)
                logger.info('Terminating %s (%s)', request.id, signum)
                request.terminate(worker.pool, signal=signum)  # triggering SoftTimeoutException in Task

        if terminated:
            terminatedstr = ', '.join(task_ids)
            logger.info('Tasks flagged as revoked: %s', terminatedstr)

        self.node_proc.shutdown()

أولاً ، ألغيت المهمة الموجودة في قائمة الطلبات المحجوزة لمنع تولي مهمة الانتظار قبل إيقاف التشغيل مباشرة.

ثم ألغيت الطلب النشط ، ثم أقوم بتشغيل استثناء SoftTimeLimitExceeded في المهمة لأتمكن من تشغيل سلوك التنظيف في المهمة. نظرًا لأنني أستخدم acks_late (لتشغيل مهمة واحدة فقط في كل مرة) ، فأنا بحاجة إلى العودة أو رفع المهمة من أجل الاعتراف بها بشكل صحيح وعدم إعادة تشغيلها في المرة القادمة التي أقوم فيها بتشغيل العامل.

أنا أستخدم مهامًا قابلة للإجهاض ، ولكن يتم ترميز سلوك الإحباط عندما يريد المستخدم إجهاض مهمة عن قصد ، ويحتاج النظام إلى إجراء بعض عمليات التنظيف المعقدة / الطويلة. هذه الحالة أشبه بإغلاق العامل ، وفي هذه الحالة أريد أن أجعل المهمة الحالية تفشل بسرعة.

أعتقد أن هذه ستكون طريقة مناسبة لعمل الأشياء في الكرفس؟

في إصدار مستقبلي سيكون من الجيد أن تكون قادرًا ببساطة على إعادة تعريف السلوك في فئة المهام ... على سبيل المثال زيادة التحميل على طريقة on_revoke () أو on_abort (). وربّما طريقة لتعدد السلوك عند الإبطال ، حسب بعض الشروط ...
فقط سنتان ، لم أقم بفحص الإصدار 4.0 من الكرفس بعد.

أي تحديث على هذا؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات