gpt4 book ai didi

python - 如何重新启动 BaseHTTPServer 实例?

转载 作者:行者123 更新时间:2023-11-28 23:01:45 32 4
gpt4 key购买 nike

这是我的:

http.py:

class HTTPServer():

def __init__(self, port):
self.port = port
self.thread = None
self.run = True
def serve(self):
self.thread = threading.Thread(target=self._serve)
self.thread.start()
def _serve(self):
serverAddress = ("", self.port)
self.server = MyBaseHTTPServer(serverAddress,MyRequestHandler)
logging.log(logging.INFO, "HTTP server started on port %s"%self.port)
while self.run:
self.server.handle_request()
def stop(self):
self.run = False
self.server.server_close()

然后在另一个文件中,重新启动它:

def restartHTTP(self):
try:
self.httpserver.stop()
reload(http)
self.httpserver = http.HTTPServer(80)
self.httpserver.serve()
except:
traceback.print_exc()

这给了我一个地址已经在使用的错误,所以看起来 HTTP 服务器没有正常停止。我还需要做些什么来阻止它?

编辑:

我调用 restartHTTP 的地方:

def commandHTTPReload(self, parts, byuser, overriderank):
self.client.factory.restartHTTP()
self.client.sendServerMessage("HTTP server reloaded.")

我知道命令正在执行,因为我收到了它应该发送的消息。

最佳答案

你只需要让操作系统知道你真的想在关闭后立即重用这个端口。通常它会保持关闭状态一段时间,以防出现任何额外的数据包。您可以使用 SO_REUSEADDR 执行此操作:

mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

..打开mysocket之后。使用 HTTPServer 执行此操作的一个好地方可能是重写的 server_bind 方法:

def server_bind(self):
HTTPServer.server_bind(self)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

编辑:仔细查看了您的代码后,我发现您的线程模型也可能在这里引起问题。您正在关闭主 (?) 线程中的套接字,而另一个线程正在等待同一套接字上的连接(在 accept() 中)。这种安排没有明确定义的语义,我相信它在不同的操作系统上做不同的事情。在任何情况下,您都应该避免这种情况,以最大程度地减少混淆(在多线程程序中已经有很多混淆)。您的旧线程在获得连接并处理其请求之前不会真正消失(因为它不会重新检查 self.run 直到那时),因此端口可能不会重新-直到之后才可绑定(bind)。

没有真正简单的解决方案。您可以在线程之间添加一个通信管道,然后在服务器线程中使用 select()/poll() 来等待其中任何一个的事件,或者您可以在短时间后使 accept() 调用超时,以便更频繁地检查 self.run。或者你可以让主线程连接到监听套接字本身。但无论您做什么,您都可能接近复杂程度,您应该考虑使用“真正的”httpd 或网络框架而不是自己动手:apache、lighttpd、Tornado、Twisted 等。

关于python - 如何重新启动 BaseHTTPServer 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705680/

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