我有一个假的 HTTP 服务器,在我的测试中用作固定装置。在测试的某个时刻,我想停止服务器,而不管任何仍然打开的连接。这些打开的连接上的客户端应该获得一个 TCP FIN。
我知道通常生产服务器需要解决不同的问题,即quiescing,有时称为优雅关闭。这与我想要的相反。
使用独立进程,通常可以简单地让进程退出,操作系统会处理其余的工作。(强行杀死进程很容易,而强行杀死线程则不然。)但是,我的假服务器运行在测试进程本身的线程中,所以我没有这个选项(我不想外部化它如果有其他方法)。
我在 Python 中使用HTTPServer 类调查了这个问题,但我找不到任何解决方案。
我还在 Go 中对此进行了调查,在那里我能够找到Contexts的概念,这与我需要的很接近,但它的工作方式相反:http 服务器将传播一个 Context 可用于取消例如数据库查找客户端是否断开连接。
编辑:看起来 Go 实际上做了我需要的,并且有一个单独的优雅和非优雅关闭方法,其中非优雅是net/http#Server.Close。
server = http.server.HTTPServer(...)
thread = threading.Thread(run=server.serve_forever)
thread.start()
# a client has connected ....
server.shutdown()
# at this point I want to have the server stopped,
# without waiting for the request handling to complete