J'écris un frontal simple basé sur un navigateur qui devrait être capable de lancer une tâche en arrière-plan et d'en tirer parti. Je souhaite que le navigateur reçoive une réponse indiquant si la tâche a été lancée avec succès, puis interroge pour déterminer quand elle est terminée. Cependant, la présence d'une tâche en arrière-plan semble empêcher la réponse de XMLHttpRequest d'être envoyée immédiatement, donc je ne peux pas rapporter le succès du lancement du processus. Considérez le code suivant (simplifié):Pourquoi une tâche d'arrière-plan bloque-t-elle la réponse dans SimpleHTTPServer?
import SocketServer
import SimpleHTTPServer
import multiprocessing
import time
class MyProc(multiprocessing.Process):
def run(self):
print 'Starting long process..'
for i in range(100): time.sleep(1)
print 'Done long process'
class Page(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
print >>self.wfile, "<html><body><a href='/run'>Run</a></body></html>"
if self.path == '/run':
self.proc = MyProc()
print 'Starting..'
self.proc.start()
print 'After start.'
print >>self.wfile, "Process started."
httpd = SocketServer.TCPServer(('', 8000), Page)
httpd.serve_forever()
Quand je lance cela, et accédez à http://localhost:8000, je reçois un bouton nommé "Run". Quand je clique dessus, le terminal affiche:
Starting..
After start.
Cependant, la vue du navigateur ne change pas .. En fait, le curseur tourne. Seulement quand j'appuie sur Ctrl-C dans le terminal pour interrompre le programme, le navigateur est mis à jour avec le message Process started.
Le message After start
est clairement imprimé. Par conséquent, je peux supposer que do_GET
est de retour après le démarrage du processus. Pourtant, le navigateur n'obtient pas de réponse avant d'avoir interrompu le processus de longue durée. Je dois conclure qu'il y a quelque chose qui bloque entre do_GET
et la réponse envoyée, qui est à l'intérieur SimpleHTTPServer
.
J'ai également essayé ceci avec les discussions et le sous-processus. Ouvrez mais avez rencontré des problèmes semblables. Des idées?
p.s. J'utilise Python 2.6.5. N'a pas testé sur d'autres versions. – Steve
Vous n'envoyez pas de réponse HTTP. Veuillez regarder ce que l'implémentation de base de 'do_GET' fait réellement avant de l'écraser sans fournir un substitut approprié. –
L'ajout de 'print >> self.wfile," Content-Type: text/plain \ n "' avant "Process started" ne fait aucune différence, le résultat est le même. – Steve