我有一個程序,維護與定期心跳服務器的連接。每過一段時間,服務器都會停止響應心跳,我必須重新連接。我用一個定時器實現了這一點,如果在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()