2013-03-27 71 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