我有一个程序,维护与定期心跳服务器的连接。每过一段时间,服务器都会停止响应心跳,我必须重新连接。我用一个定时器实现了这一点,如果在n秒后没有听到任何响应,将会调用重新连接。每次发生这种情况时,我都会泄漏一个线程,随着时间的推移,我最终会耗尽线程。Python的select.select泄漏线程
现在,为了便于重复使用,大量简化了这个插图,介绍了延迟后重新连接的方式以及总是会导致线程增加的方式。 如何杀死旧线程/套接字/选择(可能正在等待recv)?
import socket
import select
import threading
class Connection():
def tick(self):
print(threading.active_count()) # this increases every 1s!
# ... certain conditions not met/it's been too long, then:
self.reconnect()
def reconnect(self):
self.socket.shutdown(socket.SHUT_WR)
self.socket.close()
self.timer.cancel()
self.connect()
def connect(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((IP, TCP_PORT))
self.timer = threading.Timer(1, self.tick)
self.timer.start()
r,_,_ = select.select([self.socket], [], [])
if __name__ == '__main__':
Connection().connect()