您还需要并行化连接,因为设置超时时套接字会阻塞。或者,您无法设置超时,而是使用选择模块。
您可以使用asyncore模块中的dispatcher类进行此 *** 作。看一下基本的HTTP客户端示例。该类的多个实例在连接时不会互相阻塞。您可以使用线程轻松地做到这一点,而且我认为使跟踪套接字超时变得更容易,但是由于您已经在使用异步方法,因此您最好还是走在同一个轨道上。
例如,以下内容适用于我的所有Linux系统
import asyncore, socketclass 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.3Connected to cluster51 SSH-2.0-OpenSSH_4.3Connected to cluster52 SSH-2.0-OpenSSH_4.3Connected to cluster60 SSH-2.0-OpenSSH_4.3Connected to cluster61 SSH-2.0-OpenSSH_4.3...
但是,这没有考虑必须阻塞的getaddrinfo。如果您在解决dns查询时遇到问题,则必须等待一切。您可能需要自己收集DNS查询,并在异步循环中使用IP地址
如果您想要比异步异步开发工具更大的工具包,请查看Twisted
Matrix。入门有些繁琐,但这是您可以获得的python最好的网络编程工具包。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)