2013-01-08 12 views
7

Wdrażam system, który używa APScheduler (który wykorzystuje pulę wątków) w celu pobrania niektórych zasobów.uWSGI i wdzięcznie zabijanie wielowątkowej aplikacji Flask

Próbuję znaleźć sposób na wykrycie "restartu aplikacji", aby móc zamknąć pulę wątków APScheduler. Wznawiam restart wysyłając SIGHUP do procesu nadrzędnego uWSGI.

Czy ktoś próbował już jeden z nich? Jeśli tak, jaki jest właściwy sposób wykrywania zdarzenia restartowania aplikacji?

  • uwsgidecorators ma postfork dekorator, moduł
  • uwsgi ma signal_wait i signal_received funkcje

signal_wait bloków funkcyjnych więc moje wątki uruchomić ale uWSGI nie służy żądań. Próbowałem również ustawić scheduler.daemonic na False i True - to nie pomaga w żaden sposób. Proces uWSGI nadal rejestruje coś takiego:

worker 1 (pid: 20082) is taking too much time to die...NO MERCY !!!

Odpowiedz

1

staram się wymyślić sposób, aby wykryć „App restart” tak, że będę w stanie zamknąć APScheduler puli wątków.

myślę, że nie jest to prosty sposób na pewno wykryć aplikacji restart, ale uwsgi może wykonać kod po przeładowaniu lub wyłączyć w następujący sposób:

1) Kod zostanie wykonany w oddzielnym procesie: dodać hak-as-łatwość atexit do swojej uwsgi config:

[uwsgi] 
... 
hook-as-user-atexit = exec:python finalization.py 

2) zostanie wywołany w jednym z pracowników:

import uwsgi 

def will_invoked_after_reload_or_shutdown(): 
    print("I was invoked") 

uwsgi.atexit = will_invoked_after_reload_or_shutdown 

3) W takim przypadku należy przeładować przez touch uwsgi.pid. Zostanie wywołany w jednym z pracowników, dopiero po przeładowaniu: Kod

[uwsgi] 
... 
pidfile = ./uwsgi.pid 
touch-reload = ./uwsgi.pid 

Python:

import uwsgi 

def will_executed_after_reload(*args): 
    print("I was invoked") 

uwsgi.register_signal(17, "worker", will_executed_after_reload) 
uwsgi.add_file_monitor(17, "./uwsgi.pid") 
Powiązane problemy