Python:如何关闭带有持久连接的线程HTTP服务器(如何从另一个线程终止readline())?

3 投票
3 回答
2359 浏览
提问于 2025-04-15 16:29

我在用python2.6,搭建了一个用HTTPServerThreadingMixIn的服务器,这样每个请求都会在一个单独的线程中处理。同时,我还使用了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()

我想在readline()之前加一个select([rfile, closefile], [], []),然后在我想关闭服务器的时候写入closefile,但我觉得在windows上可能不行,因为select只适用于套接字。

我还有一个想法,就是跟踪所有正在运行的请求,然后调用rfile.close(),但这样会出现Broken pipe的错误。

有没有什么好的建议?

3 个回答

0

你可以通过把 closefile 也当作一个网络连接来解决Windows的问题。毕竟,这个东西大概是由你的主线程打开的,所以你可以自己决定是把它当作一个网络连接还是一个普通文件来处理;-).

1

如果你在自己的HTTPServer子类中把daemon_threads设置为真(true),那么这些线程的活动就不会阻止服务器退出。

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    daemon_threads = True
1

你快到了——正确的方法是调用 rfile.close() 来关闭文件,并且在出现断开的管道错误时,捕捉这个错误并退出你的循环。

撰写回答