gpt4 book ai didi

Python BaseHTTPServer : How to get it to stop?

转载 作者:可可西里 更新时间:2023-11-01 10:00:33 25 4
gpt4 key购买 nike

根据来源,BaseServer.shutdown() 必须从与运行服务器的线程不同的线程调用。

但是,我试图通过在 Web 请求中向服务器提供特定值来关闭服务器。

请求处理程序显然在这个线程中运行,所以在我完成后它仍然会死锁:

httpd = BaseHTTPServer.HTTPServer(('', 80), MyHandler)
print("Starting server in thread")
threading.Thread(target=httpd.serve_forever).start()

我怎样才能完成我想要的?我必须设置一个套接字或管道或其他东西(请告诉我如何做到这一点,如果它是解决方案),主线程可以阻塞并等待子线程发送消息,此时它将能够调用 shutdown()?

我目前能够通过从请求处理程序调用“httpd.socket.close()”来实现某种“某种工作”行为。这会生成一个 [Errno 9] Bad file descriptor 错误,并且似乎会终止 Windows 上的进程。

但这显然不是正确的做法。

更新约。 2013 年 8 月 我已经与 node.js 私奔来满足对强大的异步 I/O 的需求,但是大量的业余项目(例如线性代数研究、各种命令行工具前端)让我回到了 python。回顾这个问题,BaseHTTPServer 与其他选项(如 Phil 提到的各种微框架)相比可能没有什么实用值(value)。

最佳答案

1. 来自 BaseHTTPServer docs

To create a server that doesn’t run forever, but until some condition is fulfilled:

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()

允许一些 url 调用来设置终止条件,使用您喜欢的任何东西。

编辑:keep_running 是您选择的任何函数,可以很简单:

def keep_running():
global some_global_var_that_my_request_controller_will_set
return some_global_var_that_my_request_controller_will_set

您可能想要更智能且without_rediculously_long_var_names的东西。

2. BaseHTTPServer 通常比你想要的要低。有plenty of micro-frameworks可能适合您的需求

关于Python BaseHTTPServer : How to get it to stop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com