Вам нужно распараллелить соединяется, а также, так как разъемы блока при установке тайм-аут. Кроме того, вы не можете установить тайм-аут и использовать модуль выбора.
Вы можете сделать это с помощью класса диспетчера в модуле asyncore. Взгляните на основные 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-адреса в вашем цикле async
Если вам нужен более крупный инструментарий, чем асинхронный, взгляните на Twisted Matrix. Это немного тяжело, но это лучший инструментарий для сетевого программирования, который вы можете получить для python.
Хорошо, я должен извиниться здесь. Я взял код прямо из документов Python, так что это был не мой код, я принял это как должное, это правильно. И это не сработало. Мне часто случалось, что люди давали мне совет, который они даже не проверяли. Я никогда не мог догадаться, что моя ОС будет проблемой, а не кодом, поэтому я подумал, что вы только один парень, думающий, что умный и скопируйте мне код документации, даже не проверяя, работает ли он. Извините еще раз за это. Сегодня я выбросил 3 полные версии, потратив 6 часов, чтобы обнаружить, что проблема MacOS. – Tom
btw Я тестировал это снова вместе с другом в своей linux-блоке, и даже getAddrInfo, похоже, не блокирует его. Мы получаем сообщение об ошибке: [Errno 115] Выполняется операция. Таким образом, теоретически даже асинхронная работа с невосприимчивыми хостами может работать в Linux. – Tom
@Tom - np, я согласен, здесь есть тонны неосведомленных ответов, особенно в не-окнах. Что еще хуже, команды неосведомленных в конечном итоге завышают друг друга, затрудняя получение правильных ответов. – JimB