2013-03-27 72 views
1

我在我的Python腳本中使用了一堆sockets,可能是20/s。這是短暫的,在三秒鐘內完成。我試着把socket.close()發送給所有人,但由於某種原因,狀態sockets仍然堆積如山。如何在Python中強制退出CLOSE_WAIT套接字?

我該如何強制退出這些CLOSE_WAITsockets?或者我可以在其上設置較低的timeout?它們最終堆積到崩潰的地步。

這是我的插座代碼:

 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     s.settimeout(2) # 2 seconds timeout 

     l_onoff = 1 
     l_linger = 0 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger)) 

     self.s = s   
     streamloop.add_callback(self.connect, s) 

這是我的親密:

def full_close(self): 
    try: 
     self.stream.close() 
     self.s.close() 
    except Exception: 
     print 'full_close err: ', sys.exc_info()[1:3] 
     pass  
+0

有沒有辦法迭代所有'open'或'close_wait'套接字,然後殺死它們?像手動垃圾收集一樣? – knutole 2013-03-27 13:54:16

+0

除非重新設置默認設置,否則延續的代碼不會執行任何操作。不要那樣做,這只是稍後邀請某人去搗鼓它。 – EJP 2013-03-27 23:04:40

回答

1

聽起來你是什麼地方漏水插座。

有關更多信息,請參見https://stackoverflow.com/a/11240739/412080

+0

謝謝!是的,肯定。我每10,000個連接大約100-200次泄漏。但我已經讀過那個Q,而且我不能爲了我的生活找到他們可能會泄漏的地方。我正在關閉一切(兩次!)。我也在使用'Tornado IOStream' - 並且在這裏和那裏得到一些警告,但是還不足以解釋所有泄漏的套接字。有沒有辦法把他們全部收集起來,然後把他們殺掉?再次感謝。 – knutole 2013-03-27 14:19:42