Форум сайта python.su
ты ничего не перепутал? только что пробовал, все выполнилось за 3 сек
#!/usr/bin/env python import sys import gevent from gevent import socket found = [] def ip2url(ip): try: url = socket.gethostbyaddr(ip) found.append([ip,url[0]]) except: pass addrs = ['87.250.250.%s' % i for i in range(1,255)] for addr in addrs: gevent.spawn(ip2url,addr).join(timeout=0.1) for i in found:print i sys.exit()
Офлайн
vic57, в рабочей сети вроде нормально работает. В виртуалке все-равно 100% результата я так и не добился, но мне это и не так важно. Я правильно понимаю: последний скрипт порождает 254 микропотока, они выполняются последовательно и если каждый из них не успевает за 0.1сек, то выполняется следующий? Метод .join() стоит внутри цикла, а не снаружи, поэтому никакого миниDDOSа не будет, верно?
Офлайн
ты правильно понимаешь. создается один гринлет с таймаутом 0.1 сек. оптимально я думаю так:
#!/usr/bin/env python import sys import gevent from gevent import socket from gevent.pool import Pool from time import time def ip2url(ip): try: url = socket.gethostbyaddr(ip) found.append(ip +' : '+ url[0]) except: pass if __name__=="__main__": #addrs = ['173.194.222.%s' % i for i in range(1,255)] #google #addrs = ['87.250.250.%s' % i for i in range(1,255)] #yandex #addrs = ['94.100.180.%s' % i for i in range(1,255)] #mail.ru addrs = ['81.19.82.%s' % i for i in range(1,255)] #rambler pool = Pool(10) found = [] t1 = time() with gevent.Timeout(5,False): for addr in addrs: pool.spawn(ip2url,addr) pool.join() t2 = time() for i in found: print i print 'time:',t2 - t1,'found:',len(found) sys.exit()
Отредактировано vic57 (Июнь 19, 2017 14:45:21)
Офлайн
vic57, сделал так. Работает и славно. Матчасть буду подтягивать, а то сложновато так с наскока… В плане IDS, тут проблем нет.
Спасибо за помощь!
Офлайн