Я использую 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()
, но я получаю ошибки Сломанный канал.
Идеи