2009-11-29 6 views
2

J'utilise python2.6 avec HTTPServer et le ThreadingMixIn, qui gérera chaque requête dans un thread séparé. J'utilise également des connexions persistantes HTTP1.1 ('Connection: keep-alive'), donc ni le serveur ni le client ne fermeront une connexion après une requête.Python: Comment arrêter un serveur HTTP avec des connexions persistantes (comment tuer readline() à partir d'un autre thread)?

est ici à peu près ce que le gestionnaire de requêtes ressemble

request, client_address = sock.accept() 
rfile = request.makefile('rb', rbufsize) 
wfile = request.makefile('wb', wbufsize) 

global server_stopping 
while not server_stopping: 
    request_line = rfile.readline() # 'GET/HTTP/1.1' 
    # etc - parse the full request, write to wfile with server response, etc 
wfile.close() 
rfile.close() 
request.close() 

Le problème est que si j'arrête le serveur, il y aura encore quelques threads en attente sur rfile.readline().

Je mettrais un select([rfile, closefile], [], []) au-dessus du readline() et écrire à CloseFile quand je veux arrêter le serveur, mais je ne pense pas que cela fonctionnerait sur les fenêtres, car select fonctionne uniquement avec des prises.

Mon autre idée est de garder une trace de toutes les demandes en cours d'exécution et rfile.close() mais je reçois des erreurs de tuyau cassé.

Des idées?

Répondre

1

Vous êtes presque là — l'approche correcte est d'appeler rfile.close() et d'attraper les erreurs de tuyau cassé et quitter votre boucle quand cela se produit.

1

Si vous définissez daemon_threads à true dans votre sous-classe HTTPServer, l'activité des threads n'empêchera pas le serveur de se fermer.

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): 
    daemon_threads = True 
+1

Oui, mais cela ne semble pas être une bonne pratique de laisser les fils ouverts. – Alex

0

Vous pouvez contourner le problème de Windows en faisant closefile une prise aussi - après tout, car il est sans doute quelque chose qui est ouvert par votre thread principal, il est à vous de décider de l'ouvrir comme une prise ou un fichier ;-).

+0

Est-ce que request.makefile retourne un socket? – Alex

+0

'makefile' renvoie un objet de type fichier dont' fileno' est un socket. Je ne sais pas si cela vous permet de le sélectionner dans Windows (je ne fais pas Windows, et je ne l'ai pas fait depuis 10 ans, même si c'est un gourou de Windows que je vivais à l'époque; -), mais je le soupçonne. –

Questions connexes