如何关闭Python TCPServer、HTTPServer或SimpleHTTPServer?

2024-05-17 17:15:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我将为C/C++ HTTP/HTTPS客户端安装一个测试线束,我想使用Python来测试测试带中的服务器。Python似乎有一组非常好的TCP/HTTP服务器和处理程序类,似乎它是实现这一目标的阻力最小的路径。在

也就是说,我正在尝试如何优雅地关闭TCPServer对象。我的测试线束是用C++编写的,我想使用^ {CD2}}来调用服务器,只是因为它不像^ {CD3}}那样有问题,而且它可以在我的所有目标平台(Windows、OSX、Linux)上都可用。假设我使用popen()来启动python服务器,那么python进程的PID将不可用,因此我无法轻松地SIGTERM服务器。在

我想我应该向服务器进程的STDIN发送一个'q'字符,或者关闭发送它的服务器的STDIN管道,让它正常关闭。我就是想不出一个好办法。在

TCPServer/HTTPServer/等在您调用他们的.serve_forever()方法时开始工作。因此,当我调用一个名为.serve_forever()的方法时,要让{}永远停止服务是很困难的,我想我不应该感到惊讶。作为替代方案,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是否有一个名为^{的方法:

^{pr2}$

这条线安全吗?我知道GIL,但我仍然想知道,考虑到PyPy等其他python实现,这是否被认为是正确的选择。我可以在另一个线程上等待STDIN,然后在STDIN上获得EOF时安全地调用TCPServer的{}方法吗?在


Tags: 方法服务器http目标server进程isrequest
1条回答
网友
1楼 · 发布于 2024-05-17 17:15:19

是的,BaseServer.shutdown()方法是线程安全的。在

serve_forever方法在设置shutdown标志之前一直有效,设置该标志是shutdown()的任务。该方法在docstring中声明:

Blocks until the loop has finished. This must be called while serve_forever() is running in another thread, or it will deadlock.

请注意,这与GIL无关;这只限制了Python进程在C扩展和I/O之外可以有效使用的内核数量

相关问题 更多 >