2016-05-18 9 views
15

Zgodnie ze stanem Selera documentation, zadanie już wykonywane nie zostanie przerwane przez wywołanie .revoke(), chyba że ustawiono terminate=True. Ale nie jest to zalecane, ponieważ zabije samego pracownika, który mógł już rozpocząć inne zadanie. Czy to oznacza, że ​​nie ma niezawodnego, stabilnego sposobu na zrobienie tego?Czy istnieje sposób, aby zatrzymać pokojowo konkretne zadanie pracownika selera?

EDYCJA: nie pasuje do mnie, ponieważ, jak stwierdza dokumentacja, działa tylko z backendami baz danych.

+0

To zależy od zadania, które próbują rozwiązać (sieć, plik operacji bazy danych, etc.), proszę spojrzeć na ten przykład: http://stackoverflow.com/questions/37039941/celery- python-revoke W moim przypadku moje główne zadanie wywołuje procesy potomne, które nie są zakończone, chyba że wyślę sygnał SIGKILL. – spicyramen

+0

Prawdopodobny duplikat [Stopping z wdziękiem zadanie selekcji] (http://stackoverflow.com/questions/16493364/stopping-celery-task-gracefully) – Louis

Odpowiedz

2

Uruchomione zadanie jest działającym podprocesem procesu roboczego (w przypadku użycia prefektu), oznacza to, że jedynym sposobem na przerwanie zadania jest zabicie podprocesu, który go obsługuje.

Możesz spróbować eksperymentować we własnej implementacji obsługi odwołań próbując ustalić identyfikator podprocesu i zabić tylko ten, ale szczerze mówiąc nie wiesz, czy jest on wart i czy naprawdę działa.

Myślę, że krótka odpowiedź brzmi: nie możesz.

Zresztą zabijając pracownikowi potrzebne jest czasami, zwłaszcza w początkowych fazach projektów, w których trzeba jeszcze wymiar prawidłowo zasobów, po prostu upewnij się zalogować gdzieś zadań bieżących, dzięki czemu można przełożyć je lub po prostu użyć CELERY_ACKS_LATE

+0

"W każdym razie zabicie pracownika nie jest czymś niezwykłym" Jaki * zwykły * warunek uzasadniałby wypowiedzenie pracownika w systemie produkcyjnym? Używam Selera już od kilku lat, a * tylko * czas, w którym pracownik został przymusowo zakończony, to okres, w którym witryna musi być wyłączona z powodu konserwacji. – Louis

+1

Zależnie od przypadku użycia, pracuję dla dużej witryny społeczności w ciągu kilku dni i mamy pewne problemy w godzinach szczytu. Robotnicy zajmowali dużo pamięci i marzli. Oczywiście wynikało to z faktu, że nie spodziewaliśmy się, że obciążenie i pracownik, którego wymiary nie zostały poprawnie zwymiarowane. Ale mogę powiedzieć, że w ciągu jednego roku zdarzyło się kilka razy, nie biorąc pod uwagę całkowitej awarii maszyny z powodu innych czynników. –

+0

Wyjaśniłem odpowiedź po komentarzu Louisa. –

1

Możesz wysłać sygnał HUP zamiast TERM, który z wdziękiem restartuje proces potomny bez zabijania pracownika.

In [80]: import signal 

In [81]: x = add.delay(1, 2) 

In [82]: x.revoke(terminate=True, signal=signal.SIGHUP) 
+0

"Oprócz zatrzymania, a następnie uruchomienia procesu roboczego do ponownego uruchomienia, można również ponownie uruchomić pracownika za pomocą sygnału HUP, ale należy pamiętać, że pracownik będzie odpowiedzialny za ponowne uruchomienie, więc jest on podatny na problemy i nie jest zalecany do produkcji" [Źródło] (http://docs.celeryproject.org/en/latest/userguide/workers.html) – Louis

+0

@Louis Jeśli masz pracownika o współbieżności równej 4, ma on 4 procesy uruchamiające 4 zadania naraz. Ponowne uruchomienie jest złym pomysłem po prostu odwołać zadanie, ponieważ może przerwać inny proces. Powyższe polecenie uruchomi tylko jeden proces, który uruchomił to zadanie. – ChillarAnand