你需要同样并行连接,因为当你设置超时时套接字会阻塞。或者,你可以不设置超时,并使用选择模块。
你可以使用
asyncore模块中的dispatcher类来实现这一点。看一下基本的
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网络编程工具包。