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