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?
Oui, mais cela ne semble pas être une bonne pratique de laisser les fils ouverts. – Alex