[英]How to shut down a Python TCPServer or HTTPServer or SimpleHTTPServer?
我正在为C / C ++ HTTP / HTTPS客户端组装一个测试工具,我想在测试工具中使用python作为服务器。 Python似乎有一组非常好的TCP / HTTP服务器和处理程序类,看起来它将成为完成此任务的阻力最小的路径。
也就是说,我正在试图找出如何优雅地关闭TCPServer
对象。 我的测试工具是用C ++编写的,我想使用popen()
调用服务器,因为它不像system()
那样有问题,并且在我所有的目标平台(Windows,OSX,Linux)上都可用。 鉴于我正在使用popen()
来启动python服务器,我不会让python进程的PID可用,所以我不能轻易地SIGTERM
服务器。
我以为我想向服务器进程的STDIN发送一个'q'字符,或者将STDIN管道关闭到服务器发送EOF以使其正常关闭。 我真的无法想出一个非常好的方法。
当你调用他们的.serve_forever()
方法时, TCPServer
/ HTTPServer
/等开始工作。 所以我想我不应该感到惊讶的是,当我调用一个名为.serve_forever()
的方法时,很难让TCPServer
永远停止服务。 作为替代方案, BaseHTTPServer
的python文档建议反复调用.handle_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_request()
返回。
TCPServer
确实有一个名为.shutdown()
的方法:
BaseServer.shutdown()
Tell the serve_forever() loop to stop and wait until it does.
New in version 2.6.
这是线程安全的吗? 我知道GIL,但我仍然想知道这是否被认为是正确的事情 ,根据PyPy等替代python实现。 我可以在另一个线程上等待STDIN,然后在STDIN上获得EOF时安全地调用TCPServer
的.shutdown()
方法吗?
是的, BaseServer.shutdown()
方法是线程安全的。
serve_forever
方法一直有效,直到设置了shutdown标志,并且shutdown()
的任务是设置该标志。 该方法在docstring中声明:
阻塞直到循环结束。 当serve_forever()在另一个线程中运行时,必须调用它,否则它将死锁。
请注意,这与GIL无关; 这只限制了Python进程可以有效利用C扩展和I / O之外的核心数量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.