Filettatura del Gunicorn Django.
-
20-12-2019 - |
Domanda
Sto avendo problemi a trovare la documentazione sul ciclo di gunicorno / django / thread ciclo di vita.
Diciamo che un thread del daemon viene generato durante il gancio del middleware Process_response (). AFAIK Questo thread non blocca la risposta HTTP. Ma blocca il filo da cui è stato generato? Gunicorn attende il completamento di questo thread per unirsi a questo tornare al filo principale prima che il processo del lavoratore sia pronto per gestire un'altra richiesta o sarà distaccato questo thread?
data_collection / attivitàs.py:
from celery import shared_task
@shared_task(ignore_result=True)
def add_event(event_name, event_body):
...
client.add_event(event_name, event_body)
.
data_collection / middleware.py:
import threading
from data_collection.tasks import add_event
class DataCollectionMiddleware:
def process_response(self, request, response):
...
thread = threading.Thread(target=add_event.delay, args=("Page_Views", event_body))
thread.setDaemon(True)
thread.start()
.
Più dettagli:
Ho scritto una classe middleware personalizzata per inviare alcuni dati a una coda esterna (rabbitmq), che è successivamente recuperata ed elaborata asycronolmente da un lavoratore di sedano. Non voglio che questa chiamata di Enqueue over-the-wiree per bloccare la risposta del cliente, quindi avvolgo quella funzione (add_event.delay ()) in un thread "daemon" (a la http://www.artfulcode.net/articles/threading-django/ ). Questo thread potrebbe essere potenzialmente eseguito per un lungo periodo, se c'è un'interruzione di rete e la politica di riprova ha un limite lungo. In tal caso, queste discussioni potrebbero bloccare i miei processi di lavoratori di Gunicorn?
Leggo questa domanda, ma non sono sicuro se il mio thread interferisca con il "Loop principale del lavoratore": PERICOLO per avere una durata duratura ( Non deamon) Fili in un'app Django / Gunicorn?
Soluzione
no. Non c'è niente di speciale sui fili generati dai fili principali del lavoratore di Gunicorn.
Una volta che hai generato un filo, eseguirà in parallelo fino al completamento o alla morte. Gunicorn non sa di questi fili generati da fili principali dei lavoratori, quindi non prova a unirsi a loro, quindi i thread principali del lavoratore non attende il completamento del filo infantile. Inoltre, il daemon-ness del filo non ha alcun effetto; DAEMON significa semplicemente che il thread non contribuisce al "vivo-ness" del processo e funzionerà fino all'uscita del processo, quando verrà automaticamente ucciso.
Se si desidera attendere che questi fili si completino prima di riutilizzare lo stesso thread del lavoratore, è necessario farlo prima dell'applicazione WSGI (ad es. Django.core.handlers.wsgi.wsgihandler .__ Chiama __ () ) Restituisce. O scrivere del pazzo pazzo monkey per Gunicorn per tenere traccia dei fili per bambini.
TL; DR È sicuramente coltivare i fili senza rilegati con i fili per bambini a lungo funzionamento dai fili principali dei lavoratori. Meglio garantire che finiranno entro un po 'di tempo legato ai timeout.