PEHDOM
Для начала попробуйте пулять не все скопом а пакетами по 10-25 запросов за раз с интервалом в пару десятков миллисекунд, и посмотрите как оно себя поведет.
Сделал вот что:
import gevent
from gevent import socket
import time
def scan(addr):
try:
global Host_name
f = gevent.socket.gethostbyaddr(addr)
Host_name = f[0]
print(Host_name, ' - ', addr)
except:
pass
addrs = ['192.168.198.1','192.168.198.130', '192.168.198.129', '192.168.198.131']
def scanfornames():
jobs = [gevent.spawn(scan, addr)for addr in addrs ]
gevent.joinall(jobs, timeout=2)
for i in range(20):
scanfornames()
time.sleep(0.02)
print('----------------------greenlet done------------------------')
Скрипт запускает 4 микропотока через каждые 0.02 секунды на живые адреса. Вот какой получился резульатат. Строка ——greenlet done—– отображается
после каждой иерации:
———————-greenlet done————————
WINDOWS-7 - 192.168.198.130
WINDOWS-XP - 192.168.198.129
UBUNTU - 192.168.198.131
———————-greenlet done————————
DESKTOP-SK6Q7EO - 192.168.198.1
———————-greenlet done————————
WINDOWS-7 - 192.168.198.130
WINDOWS-XP - 192.168.198.129
UBUNTU - 192.168.198.131
DESKTOP-SK6Q7EO - 192.168.198.1
WINDOWS-7 - 192.168.198.130
WINDOWS-XP - 192.168.198.129
UBUNTU - 192.168.198.131
———————-greenlet done————————
Может все-таки для моей задачи рациональнее использовать один поток для функции gethostbyaddr(), а второй для создания таймаута для этой функции?