您还需要并行连接,因为设置超时时套接字会阻塞.或者,您无法设置超时,并使用选择模块.
您可以使用asyncore模块中的dispatcher类来执行此操作.看看基本的http client example.该类的多个实例将不会在连接时阻止对方.您可以轻松地使用线程来做到这一点,我认为使跟踪套接字超时更容易,但是由于您已经在使用异步方法,您可能会保持在同一个轨道上.
作为一个例子,以下工作在我所有的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.