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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top