如何关闭Python TCPServer或HTTPServer或SimpleHTTPServer?
我正在为C/C++HTTP/HTTPS客户机组装一个测试工具,我想在测试工具中为服务器使用python。Python似乎有一组非常好的TCP/HTTP服务器和处理程序类,并且似乎是实现这一点的阻力最小的路径 也就是说,我正试图弄清楚如何优雅地关闭如何关闭Python TCPServer或HTTPServer或SimpleHTTPServer?,python,multithreading,popen,httpserver,tcpserver,Python,Multithreading,Popen,Httpserver,Tcpserver,我正在为C/C++HTTP/HTTPS客户机组装一个测试工具,我想在测试工具中为服务器使用python。Python似乎有一组非常好的TCP/HTTP服务器和处理程序类,并且似乎是实现这一点的阻力最小的路径 也就是说,我正试图弄清楚如何优雅地关闭TCPServer对象。我的测试装具是用C++编写的,我想使用 PONEN()/Cux>来调用服务器,只是因为它不像 Stand()/那样有问题,而且它可以在我的所有目标平台(Windows、OSX、Linux)上都可用。考虑到我正在使用popen()启
TCPServer
对象。我的测试装具是用C++编写的,我想使用<代码> PONEN()/Cux>来调用服务器,只是因为它不像<代码> Stand()/<代码>那样有问题,而且它可以在我的所有目标平台(Windows、OSX、Linux)上都可用。考虑到我正在使用popen()
启动python服务器,我将无法使用python进程的PID,因此我无法轻松地SIGTERM
启动服务器
我想我应该向服务器进程的STDIN发送一个'q'字符,或者关闭发送它的服务器的STDIN管道EOF,让它正常关闭。我只是想不出一个真正好的方法
TCPServer
/HTTPServer
/等在您调用其方法时开始工作。永远服务()。因此,当我调用名为.service\u forever()
的方法时,让TCPServer
永远停止服务是很困难的,我想我不应该对此感到惊讶。另一种选择是,BaseHTTPServer
的python文档建议重复调用。handle\u request()
:
def run_while_true(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
"""
This assumes that keep_running() is a function of no arguments which
is tested initially and after each request. If its return value
is true, the server continues.
"""
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
while keep_running():
httpd.handle_request()
但这也不太好——它依赖于服务器接收并完成请求来检查是否继续运行——如果服务器没有收到请求,它不会从.handle\u request()
返回
TCPServer
确实有一个名为.shutdown()
的方法:
这个线安全吗?我知道GIL,但我仍然想知道,鉴于PyPy等其他python实现,这是否被认为是正确的做法。我是否可以在另一个线程上等待STDIN,然后在STDIN上获得EOF时安全地调用TCPServer
的.shutdown()
方法?是的,BaseServer.shutdown()
方法是线程安全的
serve\u forever
方法一直服务到设置了关闭标志,设置该标志是shutdown()
s任务。该方法在docstring中声明:
阻塞,直到循环完成。这必须在
serve_forever()正在另一个线程中运行,否则将死锁
请注意,这与GIL无关;这只限制了Python进程能够有效利用C扩展和I/O之外的内核的数量。谢谢!然后我将使用.shutdown()。
BaseServer.shutdown()
Tell the serve_forever() loop to stop and wait until it does.
New in version 2.6.