Question

J'ai des difficultés à trouver de la documentation sur le cycle de vie de processus / fil de thread de GunCorn / Django.

Disons qu'un thread de démon est généré pendant le crochet de Middleware Process_Response (). AFAIK Ce fil ne bloque pas la réponse HTTP. Mais, bloque-t-il le fil d'où il a été engendré? GunChicorn attend-t-il l'achèvement de ce fil de la joindre au fil principal avant que le processus de travailleur soit prêt à gérer une autre demande ou que ce fil sera-t-il détaché?

data_collection / TISESTS.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()

Plus de détails:

J'ai écrit une classe de middleware personnalisée pour envoyer des données à une file d'attente externe (rabbbitmq), qui est ensuite récupérée et traitée de manière asychronnée par un travailleur de céleri. Je ne veux pas que cet appel en Enqueue sur-three sur-le-fil peut bloquer la réponse du client, alors j'enmouie cette fonction (add_event.delay ()) dans un thread "Daemon" (A la http://www.artfulcode.net/articles/Trireading-django/ ). Ce fil peut potentiellement fonctionner pendant une longue période, s'il y a une panne de réseau et la politique de réessaye a une longue limite. Dans ce cas, ces threads bloquaient-ils mes processus de travailleurs armés?

J'ai lu cette question, mais je ne sais pas si mon fil est interférant avec la "boucle principale du travailleur": Danger d'avoir longtemps durable ( Threads non-Damon) dans une application Django / Gunicorn?

Était-ce utile?

La solution

Non. Il n'y a rien de spécial sur les threads engendré à partir de threads principaux de l'ouvrier des hommes armés.

Une fois que vous avez reproduit un fil, il s'exécutera en parallèle jusqu'à l'achèvement ou la mort. Gunicorn ne sait pas sur ces threads engendré à partir de threads principaux travailleurs. Il n'essaie donc pas de les rejoindre. Par conséquent, les threads principaux travailleurs n'attendront pas l'achèvement des fils d'enfants. En outre, le démon-ness du fil n'a aucun effet; Daemon signifie simplement que le thread ne contribuera pas au "vivant-ness" du processus et fonctionnera jusqu'à la sortie du processus, quand il sera automatiquement tué.

Si vous souhaitez attendre que ces threads se terminent avant de réutiliser le même thread de travailleur, vous devez le faire avant l'application WSGI (par exemple, django.core.handlers.wsgi.wsgihandler .__ appel __ () ) retourne. Ou écrivez un patch de singe fou pour GunCorn pour garder une trace des filets enfants.

TL; DR Vous pouvez certainement cultiver des fils sans lier en accumulant des filets enfants à long terme des fils principaux du travailleur. Mieux garantir qu'ils finiront dans un certain temps avec des délais d'attente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top