2015-02-05 3 views
9

Я хотел бы запустить SimpleHTTPServer в отдельном потоке, делая что-то еще (здесь time.sleep(100)) в главном. Вот упрощенный пример моего кода:SimpleHTTPServer запущен как нить: не daemonize

from SimpleHTTPServer import SimpleHTTPRequestHandler 
from BaseHTTPServer import HTTPServer 

server = HTTPServer(('', 8080), SimpleHTTPRequestHandler) 
print 'OK UNTIL NOW' 
thread = threading.Thread(target = server.serve_forever()) 
print 'STUCK HERE' 
thread.setdaemon = True 
try: 
    thread.start() 
except KeyboardInterrupt: 
    server.shutdown() 
    sys.exit(0) 

print 'OK' 

time.sleep(120) 

Однако нить остается «блокировка», то есть не запускается как демон и интерпретатор не достигает print 'OK'. Он не доходит до STUCK HERE.

У меня есть хотя бы то, что нить будет инициализироваться только при вызове threading.Thread(...) и что основной поток по-прежнему будет идти дальше, пока не найдет инструкцию thread.start для ее запуска.

Есть ли лучший способ выполнить эту задачу?

+1

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

ответ

9

Изменить это:

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

Для этого:

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

И изменить это:

thread.setdaemon = True 

Для этого:

thread.daemon = True 
3

Попробуйте thread = threading.Thread(target = server.serve_forever), т. Е. Без вызова.

Проблема с вашей версией заключается в том, что serve_forever() вызывается при разборе строки, в которой создается поток. Таким образом, вы никогда не доберетесь до следующей строки.

Тип аргумента должен быть вызван, который будет вызываться при запуске потока, поэтому вам нужно передать имя, server.serve_forever вместо того, чтобы пытаться передать результат выполнения этой функции.

Смежные вопросы