2013-01-21 13 views
6

W selera, czy istnieje prosty sposób na utworzenie (serii) zadań, które mógłbym użyć do automagicznie restartu pracownika?Python Celery zadanie restartu pracownika selera

Celem jest, aby moje wdrożenie automagicznie ponownie uruchomiło wszystkich pracowników selera, za każdym razem, gdy otrzyma nowe źródło z github. Mógłbym więc wysłać zadanie restartWorkers() do mojego instancji zarządzania selerem na tym komputerze, które zabiłoby (właściwie odstąpiło) wszystkie procesy związane z selerem na tym komputerze i zrestartowało je z nowymi modułami.

Plan jest dla każdej maszyny mają:

  • węzeł zarządzania [Kolejki: Zarządzanie, maszyna specyficzny] - odpowiedzialny za zarządzanie resztę robotników na maszynie, przynosząc nowe węzły i zabijając stare w razie potrzeby
  • Węzły pracowników [Kolejki: specyficzne dla gitów, specyficzne dla pracownika, specyficzne dla maszyny] - Właściwie odpowiedzialne za wykonanie pracy.

Wygląda kodu potrzebne jest gdzieś w dist_packages/selera/bin/celeryd_multi.py, ale źródło jest dość czytelny dla począwszy pracowników, i nie mogę powiedzieć, jak to ma działać lub gdy jest to faktycznie uruchamiając węzły. (Wygląda na to, że shutdown_nodes to poprawny kod wzywający do zabicia procesów, a ja powoli debuguję przez to, aby dowiedzieć się, jakie powinny być moje argumenty)

Czy istnieje funkcja/funkcje restart_nodes (self, węzły) gdzieś, co mógłbym wywołać lub czy będę uruchamiał skrypty powłoki z poziomu Pythona?

/Czy istnieje prostszy sposób na ponowne załadowanie źródła do Pythona niż zabicie i ponowne uruchomienie procesów? Gdybym wiedział, że przeładowanie modułu faktycznie zadziałało (eksperymenty mówią, że tak nie jest, zmiany w funkcjach nie przenikają, dopóki nie uruchomię ponownie procesu), po prostu zrobiłbym to zamiast pośrednika z węzłami zarządzania.

EDIT: Mogę teraz wyłączyć, dzięki transmisji (Dziękuję mihael.Jeśli miałbym więcej przedstawicieli, przegłosowałbym). Jakikolwiek sposób nadać restart? Istnieje pool_restart, ale to nie zabija węzła, co oznacza, że ​​nie zaktualizuje źródła.

Zajrzałem do niektórych źródeł zza kulis w selera.bin.celeryd: WorkerCommand(). Run(), ale zdarzają się dziwne rzeczy przed i po wywołaniu, więc mogę ' po prostu zadzwoń do tej funkcji i skończmy, bo się zawiesza. To po prostu ma sens wywoływać polecenie powłoki ze skryptu Pythona, aby uruchomić inny skrypt Pythona, i nie mogę uwierzyć, że jestem pierwszym, który chce to zrobić.

+0

„Jest pool_restart, ale nie zabić węzeł, co oznacza, że ​​nie będzie aktualizować źródło” - naprawdę żałuję, że nie masz na to rozwiązania, ale wygląda na to, że pozostało nierozwiązane. – AlanSE

+0

jak poradzisz sobie z robotnikami? używasz systemd? możesz mieć zadania execRestart i wywoływać systemctl restartować selery.service na przykład na końcu wdrożenia – shalbafzadeh

+0

Firma ta przeszła 4 lata temu, więc nie ma to teraz znaczenia i zapominam. –

Odpowiedz

2

Możesz spróbować użyć selera broadcast functionality.

Tutaj można zobaczyć kilka dobrych przykładów: https://github.com/mher/flower/blob/master/flower/api/control.py

+0

W połowie drogi. Mogę się zamknąć, ale nie mogę go przywołać. Dzięki. –

+0

Czy komunikat 'pool_restart' wykona zadanie? Prawdopodobnie nie nadrobi nowych zadań, ale uchwyci aktualizacje dla istniejących obiektów. Nie jestem w 100% pewny, kiedy Seler łączy symboliczną nazwę zadania z konkretną wywoływaną.Jeśli zdarzy się to w samej puli, restartowanie go rozwiązałoby zadanie, o ile je otrzymam. –

+4

Nie. Zdefiniowano zadanie Dodaj (x, y), które zwróciło x + y. Rozpoczął się seler. 'add.delay (4,4)' zwraca 8. Zmieniono dodaj, aby zwrócić x * y. 'broadcast ('pool_restart')'. 'add.delay (4,4)' nadal zwraca 8 zamiast 16. Zauważ, że to zachowanie było również obserwowane pod flagą '--autoreload'. –

Powiązane problemy