您还需要并行化连接,因为设置超时时套接字会阻塞。或者,您不能设置超时,并使用选择模块。
您可以使用异步模块中的调度程序类来执行此操作。看一下基本的http 客户端示例。该类的多个实例在连接时不会相互阻塞。您可以像使用线程一样轻松地做到这一点,我认为跟踪套接字超时更容易,但由于您已经在使用异步方法,您最好保持在同一轨道上。
例如,以下适用于我所有的 linux 系统
import asyncore, socket
class client(asyncore.dispatcher):
def __init__(self, host):
self.host = host
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host, 22))
def handle_connect(self):
print 'Connected to', self.host
def handle_close(self):
self.close()
def handle_write(self):
self.send('')
def handle_read(self):
print ' ', self.recv(1024)
clients = []
for i in range(50, 100):
clients.append(client('cluster%d' % i))
asyncore.loop()
在 cluster50 - cluster100 中,有许多机器无响应或不存在。这立即开始打印:
Connected to cluster50
SSH-2.0-OpenSSH_4.3
Connected to cluster51
SSH-2.0-OpenSSH_4.3
Connected to cluster52
SSH-2.0-OpenSSH_4.3
Connected to cluster60
SSH-2.0-OpenSSH_4.3
Connected to cluster61
SSH-2.0-OpenSSH_4.3
...
然而,这并没有考虑到 getaddrinfo,它必须阻塞。如果您在解决 dns 查询时遇到问题,一切都必须等待。您可能需要自己单独收集 dns 查询,并在异步循环中使用 ip 地址
如果您想要比 asyncore 更大的工具包,请查看Twisted Matrix。入门有点繁重,但它是您可以获得的用于 python 的最佳网络编程工具包。