Czytałem dokument i szukałem, ale nie mogę znaleźć prostej odpowiedzi:
Czy możesz anulować już wykonywane zadanie? (ponieważ zadanie zostało rozpoczęte, zajmuje trochę czasu, aw połowie musi zostać anulowane)
Znalazłem to z dokumentu w Celery FAQ
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Ale nie jestem pewien, czy spowoduje to anulowanie zadań w kolejce, czy też zabije działający proces na poziomie roboczym. Dzięki za każde światło, które możesz rzucić!
źródło
W Celery 3.1 zmieniono API odwoływania zadań .
Zgodnie z często zadawanymi pytaniami dotyczącymi selera , powinieneś użyć result.revoke:
>>> result = add.apply_async(args=[2, 2], countdown=120) >>> result.revoke()
lub jeśli masz tylko identyfikator zadania:
>>> from proj.celery import app >>> app.control.revoke(task_id)
źródło
@ Odpowiedź 0x00mh jest prawidłowa, jednak niedawne seler docs powiedzieć, że korzystając z
terminate
opcji to „ ostatnia deska ratunku dla administratorów ”, ponieważ można przypadkowo zakończenia innego zadania, który rozpoczął wykonywanie w międzyczasie. Prawdopodobnie lepszym rozwiązaniem jest połączenieterminate=True
zsignal='SIGUSR1'
(co powoduje zgłoszenie wyjątku SoftTimeLimitExceeded w zadaniu).źródło
SoftTimeLimitExceeded
jest zgłaszane w moim zadaniu, wywoływana jest moja niestandardowa logika czyszczenia (zaimplementowana za pomocątry
/except
/finally
). Moim zdaniem jest to o wiele lepsze niż to, coAbortableTask
oferuje ( docs.celeryproject.org/en/latest/reference/ ... ). W tym drugim przypadku potrzebujesz zaplecza wyników bazy danych i musisz ręcznie i wielokrotnie sprawdzać stan trwającego zadania, aby zobaczyć, czy zostało przerwane.worker_prefetch_multiplier = 1
ponieważ mam tylko kilka długo działających zadań, zakończenie powinno być w porządku - ponieważ żadne inne zadania nie zostaną wykonane przez zakończenie - czy otrzymałem to poprawnie? @spicyramenZobacz następujące opcje zadań: time_limit , soft_time_limit (lub możesz ustawić to dla pracowników). Jeśli chcesz kontrolować nie tylko czas wykonania, a następnie zobaczyć wygasa argument metody apply_async.
źródło
Ponadto niezadowalający, istnieje inny sposób (przerwanie zadania) zatrzymania zadania, ale jest wiele zawodności, więcej szczegółów patrz: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html
źródło