Python: Как отключить многопоточный HTTP-сервер с постоянными соединениями (как убить readline () из другого потока)? - PullRequest
2 голосов
/ 29 ноября 2009

Я использую python2.6 с HTTPServer и ThreadingMixIn, которые будут обрабатывать каждый запрос в отдельном потоке. Я также использую постоянные соединения HTTP1.1 («Connection: keep-alive»), поэтому ни сервер, ни клиент не закрывают соединение после запроса.

Вот примерно так выглядит обработчик запроса

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()

Проблема в том, что если я остановлю сервер, все еще будет несколько потоков, ожидающих на rfile.readline().

Я бы поставил select([rfile, closefile], [], []) над readline() и записал бы в closefile, когда я хочу завершить работу сервера, но я не думаю, что он будет работать в Windows, поскольку select работает только с сокетами.

Моя другая идея - отслеживать все запущенные запросы и rfile.close(), но я получаю ошибки Сломанный канал.

Идеи

Ответы [ 3 ]

1 голос
/ 29 ноября 2009

Если вы установите для daemon_threads значение true в своем подклассе HTTPServer, активность потоков не помешает серверу завершиться.

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    daemon_threads = True
1 голос
/ 29 ноября 2009

Вы почти у цели - правильный подход - вызвать rfile.close(), перехватить ошибки сломанной трубы и выйти из цикла, когда это произойдет.

0 голосов
/ 29 ноября 2009

Вы можете обойти проблему Windows, сделав closefile также сокетом - в конце концов, поскольку он предположительно является чем-то, что открывается вашим основным потоком, вам решать, открывать ли его как сокет или файл; -)

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...