gpt4 book ai didi

python - 无法在 SocketServer.TCPServer 中重用套接字

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:30 24 4
gpt4 key购买 nike

我遇到了 SocketServer.TCPServer 的问题。我在线程中运行服务器。用看门狗看目录树。当“on_any_event”运行时,我需要关闭服务器并重新启动它。不幸的是,我无法让 SocketServer.TCPServer 重用该地址。我已经检查了 SocketServer.py 文件,如果 allow_reuse_address 为 True,则应该将 socket.SO_REUSEADDR 设置为 1。它仍然失败并显示 error: [Errno 98] 地址已在使用中尽管。在重试之前睡 10 秒也无济于事。有帮助吗?

class Server(SocketServer.TCPServer):
allow_reuse_address = True

class ChangeHandler(FileSystemEventHandler):
def __init__(self):
FileSystemEventHandler.__init__(self)
self.rebuild()

def on_any_event(self, event):
print event
self.httpd.shutdown()
self.t.join()
self.rebuild()

def rebuild(self):
self.t, self.httpd = runserver()

def runserver():
handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = Server((HOST, PORT), handler, bind_and_activate=False)
httpd.server_bind()
httpd.server_activate()
t = threading.Thread(target=httpd.serve_forever)
t.daemon = True
t.start()
print "Live at http://{0}:{1}".format(HOST, PORT)
return t, httpd

if __name__ == "__main__":
handler = ChangeHandler()
observer = Observer()
observer.schedule(handler, path=ROOT, recursive=True)
observer.start()

try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

最佳答案

TCPServer 实现了未记录的方法 server_close(),在事件处理程序中的 self.t.join() 之前或之后调用它,因为这实际上将关闭底层套接字。如所写,您可能会泄漏套接字。

def on_any_event(self, event):
print event
self.httpd.shutdown()
self.httpd.server_close() # actually close the socket
self.t.join()
self.rebuild()

在您关闭套接字之前,该地址实际上正在使用中。

关于python - 无法在 SocketServer.TCPServer 中重用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307986/

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