Форум сайта python.su
количество запросов ограничивается пропускной способностью сети. https://github.com/gevent/gevent/blob/master/examples/dns_mass_resolve.py
в данном примере создается пул из 10 сокетов, после выполнения(или таймаута) создается следующий пул
http://blog.pythonisito.com/2012/08/building-tcp-servers-with-gevent.html
а здесь устанавливается лимит сервера на 10000 соединений
Отредактировано vic57 (Июнь 15, 2017 11:09:53)
Офлайн
Рано я обрадовался. Тут вот какое дело.
Есть код:
def scan(addr): try: global Host_name f = gevent.socket.gethostbyaddr(addr) Host_name = f[0] print(Host_name, ' - ', addr) except: pass def scanfornames(): x = input('Input first 3 octets of the network:(X.X.X.):') addrs = [x + str(i) for i in range(255)] jobs = [gevent.spawn(scan, addr)for addr in addrs ] gevent.joinall(jobs, timeout=5) #jobresults = [job.value for job in jobs] end = input('Restart scan? y / n ') if end == 'y': scanfornames() scanfornames()
Офлайн
А это не DNS-серверу плохеет?
Офлайн
PooHЯ запускал как в рабочей сети, так и в виртуальной среде на своем ноуте. Результаты и там и там скачут…
А это не DNS-серверу плохеет?
Офлайн
UrfinJuice в вашей ситуации уравнение как минимум из трех неизвестных: ваш скрипт, сеть, ДНС-сервер.
PooH высказал правильное предположение, вас скрипт пуляет в ДНС -сервер 254 запроса одновременно, получается эдакая миниDDOS-атака. На реальной сети все пакеты проходят через свич, который умеет бороться с таким поведением, да и сеть имеет загрузку поэтому пакеты вылетевшие одновременно приходят на ДНС-сервер с некотороым разбросом по времени. На виртуалке же у вас минимум сетевой активности, и свича по сути нет, вот ваш ДНС и прикуевает от такого напора.
+ на ДНС сервере может стоять ограничение на одновременное к-во соедиенений от одного хоста, вот часть запросов и отбрасывается.
Для начала попробуйте пулять не все скопом а пакетами по 10-25 запросов за раз с интервалом в пару десятков миллисекунд, и посмотрите как оно себя поведет. Ну и мониторте загрузку сети при работе вашего скрипта, и загрузку ДНС сервера.
[code python][/code]
Отредактировано PEHDOM (Июнь 15, 2017 20:48:42)
Офлайн
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------------------------')
Офлайн
имхо дело тут в сети
попробуй со стандартным сокетом
#!/usr/bin/env python import sys import gevent #from gevent import socket import socket addrs = ['192.168.198.1','192.168.198.130', '192.168.198.129', '192.168.198.131'] def job(addr): try: url = socket.gethostbyaddr(addr) print addr,':',url except Exception as e: print addr,str(e) for addr in addrs: jobs = [gevent.spawn(job,addr)] gevent.joinall(jobs,timeout=1) sys.exit()
Отредактировано vic57 (Июнь 16, 2017 13:09:50)
Офлайн
vic57Попробовал, не знаю в чем разница, но на маленьких объемах пока заработало! Буду пробовать на больших.
имхо дело тут в сети/попробуй со стандартным сокетом
Отредактировано UrfinJuice (Июнь 16, 2017 14:06:27)
Офлайн
стандартный сокет так и должен
попробуй последовательно
#!/usr/bin/env python import sys import gevent from gevent import socket addrs = [] urls = ['www.google.ru', 'www.yandex.ru', 'www.python.su', 'www.ya.ru', 'www.youtube.com' ] def job(url): try: ip = socket.gethostbyname(url) print url,ip addrs.append(ip) except Exception as e: print url ,e def job2(ip): try: url = socket.gethostbyaddr(ip) print ip,url[0] except Exception as e: print ip ,e for url in urls: gevent.spawn(job,url).join(timeout=1) for addr in addrs: gevent.spawn(job2,addr).join(timeout=1) sys.exit()
Офлайн
vic57Пробую на своей виртуалке код, что вы написали. Вместо урлов - свои машины. Опять то два, то три, то вообще нет результатов…. Ну здесь, правда, может из-за того, что я сам себе ДНС и одновременные запросы просто мешают друг-другу. Можно было бы забить на виртуалку, раз в промышленной среде все работает, но при маленьком количестве потоков и большем таймауте имя живого сервера тоже через раз определяется..
стандартный сокет так и должен
попробуй последовательно
Офлайн