Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何关闭Python TCPServer或HTTPServer或SimpleHTTPServer?_Python_Multithreading_Popen_Httpserver_Tcpserver - Fatal编程技术网

如何关闭Python TCPServer或HTTPServer或SimpleHTTPServer?

如何关闭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()启

我正在为C/C++HTTP/HTTPS客户机组装一个测试工具,我想在测试工具中为服务器使用python。Python似乎有一组非常好的TCP/HTTP服务器和处理程序类,并且似乎是实现这一点的阻力最小的路径

也就是说,我正试图弄清楚如何优雅地关闭
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.