[英]Can't reuse socket in SocketServer.TCPServer
我遇到了SocketServer.TCPServer的問題。 我正在一個線程中運行一個服務器。 用Watchdog監視目錄樹。 當“on_any_event”運行時,我需要取下服務器並重新啟動它。 不幸的是我無法讓SocketServer.TCPServer重用該地址。 我檢查了SocketServer.py文件,如果allow_reuse_address
為True, socket.SO_REUSEADDR
將socket.SO_REUSEADDR
設置為1.它仍然會失敗並顯示error: [Errno 98] Address already in use
。 在重試前睡覺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()
在關閉套接字之前,地址實際上正在使用中。
在self.httpd.server_close()
之后添加self.httpd.shutdown()
就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.