【问题标题】:How to force-quit a CLOSE_WAIT socket in Python?如何在 Python 中强制退出 CLOSE_WAIT 套接字?
【发布时间】:2013-03-17 14:06:14
【问题描述】:

我在我的 Python 脚本中使用了一堆 sockets,可能是 20/s。这些是短暂的,在三秒钟内完成。我已经尽力将socket.close() 发送到所有内容,但由于某种原因sockets 上的CLOSE_WAIT 状态仍然不断堆积。

如何强制退出这些CLOSE_WAIT sockets?或者我可以在它们上设置一个较低的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    

【问题讨论】:

  • 有没有办法遍历所有openclose_wait 套接字然后杀死它们?像手动垃圾收集一样?
  • 该逗留代码除了重新设置默认设置外什么都不做。不要那样做,这只是邀请以后有人摆弄它。
  • 嘿@knutole 你找到答案/解决方案了吗?
  • @Kazuki 对不起,已经 7 年了,我不记得了。

标签: python c sockets tcp


【解决方案1】:

听起来你在某处泄漏了套接字。

请参阅https://stackoverflow.com/a/11240739/412080 了解更多信息。

【讨论】:

  • 谢谢!是的,绝对的。我每 10.000 个连接泄漏大约 100-200 个。但是我读过那个Q,我一辈子都找不到它们可能在哪里泄漏。我正在关闭一切(两次!)。我也在使用Tornado IOStream - 并在各处得到一些警告,但不足以解释所有泄漏的套接字。有没有办法不时将它们全部收集起来,然后将它们杀死?再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多