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

标签 python sockets tornado nonblocking

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

关于 "[Errno -2] Name or service not known"上的 Python 套接字 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14846073/

相关文章:

python - Django orm 为每个组获取最新信息

python - 处理来自 IOS 设备的请求时发生异常

java - android中的套接字、线程和服务,如何让它们协同工作?

multithreading - Indy 10 IdTCPClient 使用单独的线程读取数据?

python - epoll 和 kqueue 之间有什么主要的性能差异吗?

python - 如何在python中拆分但忽略引用字符串中的分隔符?

python - 检查字典中的键是否定义

python - 有没有办法从 POST/PUT 中与 Tornado 服务器异步检索正文?

python - 添加与 Tornado TCPClient 的连接超时

python - 实时网络聊天应用程序的架构