2017-05-26 7 views
0

J'essaye d'exécuter de manière asynchrone un script cgi python 2.7 de longue durée et de renvoyer un code html complet au navigateur afin qu'il ne soit pas temporisé (et sans attendre que le script se termine). .. Je cours sur Windows XAMPP et le code abrégé est ci-dessousL'appel CGI Python asynchrone arrête le navigateur jusqu'à la fin

Mon problème est que le navigateur attend encore jusqu'à ce que le script soit complet ... Est-ce que je fais quelque chose de mal? J'ai lu d'autres questions similaires et ils ajoutent que l'ajout d'arguments stdout et stderr peut résoudre le problème, mais cela n'a pas été le cas ... J'ai également essayé de définir close_fds = True et d'éliminer les arguments stdout/sterr ... script.py fonctionne bien seul et n'a aucune sortie ...

Ou y at-il une autre approche que vous recommanderiez? Merci pour toute aide que vous pouvez fournir!

#!c:\program files\anaconda2\python.exe 
import cgi 
import subprocess 
import sys 

subprocess.Popen([sys.executable, 'c:/path/script.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

print 'Content-type:text/html\r\n\r\n' 
print '<html>' 
print '<head></head>' 
print '<body></body>' 
+0

double possible de [en utilisant asyncio pour faire la tâche périodique django] (https://stackoverflow.com/questions/43838872/using-asyncio-to-do-periodic-task-in-django) – e4c5

+0

Lol , Je ne suggère pas que vous utilisez asyncio. S'il vous plaît prenez un moment pour lire la réponse – e4c5

+0

Merci! J'espérais quelque chose d'un peu plus léger que le céleri, car il ne fonctionnera que très rarement et la mise en place de toute cette infrastructure me semble un peu difficile. Y a-t-il peut-être une autre solution que vous recommanderiez? –

Répondre

0

Il y a quelques drapeaux à Popen pour détacher le processus du parent ... Cela permet cgi de « finir », même si le processus de l'enfant est toujours en cours.

kwargs = {} 
CREATE_NEW_PROCESS_GROUP = 0x00000200 # note: could get it from subprocess 
DETACHED_PROCESS = 0x00000008   # 0x8 | 0x200 == 0x208 
kwargs.update(creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP) 
subprocess.Popen([sys.executable, 'c:/path/script.py'], close_fds=True, **kwargs)