繁体   English   中英

如何关闭Python TCPServer或HTTPServer或SimpleHTTPServer?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM