Skip to main content
 首页 » 编程设计

"[Errno -2] Name or service not known"上的 Python 套接字 block

2025年05月04日13kuangbin

我在 Tornado IOLoop 中异步运行非阻塞套接字。但是,尽管如此,有时会发生阻塞(如 0% CPU 所证明),并且总是导致 Errorno -2 Name or service not known。

为什么会这样?

它会阻塞大约五秒钟(至少是超时的两倍多)。在任何给定时间可能有 15-30 个打开的套接字,通过 setsockopt 标志重复使用。

套接字:

    # make connection    
    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 
 
    ioloop.add_callback(self.connect, s) 

Tornado 错误警告:

WARNING:tornado.general:Connect error on fd 23: [Errno -2] Name or service not known 

请您参考如下方法:

不确定这是否是答案,但我认为它有帮助(见第三段):

        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 
 
        streamloop.add_callback(self.connect, s) 
 
        # added this to close sockets completely after use. might help. 
        l_onoff = 1 
        l_linger = 0 
        s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger))