Python socket在"[Errno -2] 未知的名称或服务"上阻塞?

2 投票
1 回答
1323 浏览
提问于 2025-04-17 15:42

我在Tornado的IOLoop中异步运行非阻塞的套接字。但是,尽管如此,有时候还是会出现阻塞(这时CPU使用率为0%),并且总是会导致一个错误: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

1 个回答

0

我不确定这是不是答案,但我觉得这对我有帮助(见第三段):

        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))

撰写回答