2013-07-26 1 views
2

Ma pile est Nginx + Flup + Flask. J'ai donc un thread fini qui exécute un thread d'arrière-plan qui a une durée de vie finie.Comment puis-je exécuter des threads d'arrière-plan après que la requête a été répété avec nginx/flup?

t = threading.Thread(target=campaign.run, args=(campaign_obj,)) 
t.setDaemon(False) 
t.start() 

Il est exécuté, dure environ une minute ou 2, puis il se termine. La chose est, pour la réactivité, je l'ai renvoyer une valeur à la demande d'abord tandis que le processus d'arrière-plan est toujours exécuté.

Le problème est, d'une manière ou d'une autre, que le thread fcgi continue à être tué.

J'ai essayé de changer le connection_timeout à 1800

keepalive_timeout 1800s; 

Redémarré nginx, et maintenant il est coupé presque immédiatement après que le fil est répondu.

Comment puis-je soit

1) solution simple mon code python/code fcgi (sans refactorisation dans une énorme nouvelle pile avec Redis/rabbitmq/céleri c'est vraiment un projet rapide)

2) Arrêtez nginx de tuer mon fil, au moins pas si tôt.

Merci!

+0

Utiliser le sous-processus. – snf

+0

sous-processus ou multitraitement? – nubela

+0

Oui désolé, je parle de multitraitement: http://docs.python.org/2/library/multiprocessing.html#the-process-class. – snf

Répondre

0

Utilisez multitraitement

Dès que vous retournez une valeur, et remplissez la demande, FastCGI va nettoyer après vous, et cela signifie que tous les fils vous a donné naissance. Si vous avez vraiment besoin de votre tâche pour continuer à cocher, vous devez utiliser multitraitement afin que le processus que vous avez engendré peut survivre à la fin de la demande.

Sinon, Celery est vraiment facile à configurer, et résout exactement ce problème ...

+0

Je ne pense pas que le sous-processus fonctionne à moins que j'écrive un autre script autonome. je suis d'accord sur le céleri. mais je pense que la bonne réponse est en réalité multiprocesses – nubela

+0

sous-processus fonctionne en forçant votre processus actuel. (AFAIK) – Thomas

+0

Vous avez raison, je confondais les deux. Le multitraitement est ce dont vous avez besoin. – Thomas

Questions connexes