Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

HTTPServer dans un thread: pas possible de daemoniser correctement, thread reste bloquant

+2 votes

Je voudrais savoir pourquoi le thread semble lancé dès sa définition, il m'avait semblé qu'il n'est lancé que lorsque la méthode mythread.start() était appelée.

Voici un exemple simplifié de ce que je voudrais faire:

#!/usr/bin/env python

import sys
import threading

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer

server = HTTPServer(('', 8080), SimpleHTTPRequestHandler)
 print 'je maffiche encore'
thread = threading.Thread(target = server.serve_forever())
print 'Je ne maffiche pas'
thread.setdaemon = True
thread.start()

 print 'je maffiche et le programme termine juste apres si le thread est vraiment daemonise'

Éventuellement, existe-il une méthode plus efficace/pythonesque/simple de faire? Le serveur web a besoin d'être lancé dans un contexte séparé (je me demande si je ferais pas mieux d'utiliser subprocess.Popen)

demandé 5-Fev-2015 par chibollo (170 points)

2 Réponses

+2 votes
 
Meilleure réponse

Le problème vient du fait que tu lance le serveur en dehors du thread :

thread = threading.Thread(target = server.serve_forever())

Si tu veux que le tread recoive une référence à ta fonction, il faut faire :

thread = threading.Thread(target = server.serve_forever)

Note l'absence de parenthèses. Dans le premier cas, tu appelles ta fonctions, dans le deuxième cas, tu passe une référence à ta fonction en paramètre.

répondu 6-Fev-2015 par Sam (4,984 points)
sélectionné 6-Fev-2015 par chibollo

Merci pour l'éclaircissement, c'est ce que j'avais finalement fait dans ma réponse; ça marchait mais je ne comprenais pas vraiment pourquoi.

+1 vote

Bon, après m'être bien cassé la tête, en créant une fonction distincte pour le target, on arrive à nos fins:

#!/usr/bin/env python

import sys
import time
import threading

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer

def my_function(server):
    server.serve_forever()

if __name__ == '__main__':

    server = HTTPServer(('', 8080), SimpleHTTPRequestHandler)
    t = threading.Thread(target = my_function, args=(server,))
    t.start()

    try:
        while(1):
            time.sleep(1) # code "métier" fait ici
    except KeyboardInterrupt:
        server.shutdown()

print 'OK'
répondu 5-Fev-2015 par anonyme
...