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

标签 python multithreading sockets

我将 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 错误。

想法?

最佳答案

您就快完成了 — 正确的方法是调用 rfile.close() 并捕获损坏的管道错误并在发生这种情况时退出循环。

关于Python:如何关闭具有持久连接的线程化 HTTP 服务器(如何从另一个线程中终止 readline())?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1814575/

相关文章:

python - 让信号在 PulseAudio 的 DBus 接口(interface)上工作?

python - Django 管理员 : add inlines dynamically

PHP socket_read() 只获取流的第一个字节

c++ - 组织 C++ 套接字服务器的最佳方式是什么?

c - 使用 write() 系统调用写一个完整的缓冲区

python - 在Python2.7中实现Barrier

python - 从两个列表中找到相同的元素并打印两个列表中的元素

C++ 在 Linux 中的多线程程序中处理按键

c# - 使用线程池复制 100.000 个文件

python - 检测 OS X 中挂起的 python shell