Задать вопрос

Python, как пинговать много хостов?

Добрый день, есть задача брать урлы и пинговать, то есть проверять доступны ли хосты. Нужно проверить допустим 30000 хостов в течении минуты. Какие подходы можно использовать ?
Я пробовал спомощью библиотеки requests-futures, но этого недостаточно.
class GeneratorReportStatNodes:
    def __init__(self):
        arg_parser = ArgParser()
        self.file_name_with_urls = arg_parser.namespace.file_name_with_urls
        self.file_name_for_unloading_stat = arg_parser.namespace.file_name_for_unloading_stat
        self.session = FuturesSession(
            executor=ThreadPoolExecutor(max_workers=100),
        )

    def get_stat(self):
        self._get_result(self.file_name_with_nodes)

    def _head(self, url: str):
        try:
            return self.session.head(url)
        except ConnectionError:
            return self.session

    def _get_result(self, file_name: str):
        futures = []
        cnt = 0
    
        with open(file_name, "r") as f:
            for url in f:
                futures.append(
                    self._head(url)
                )
    
        for future in as_completed(futures):
                res = future.result()
                cnt += 1
                print(res, cnt)
  • Вопрос задан
  • 406 просмотров
Подписаться 3 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
@deliro
Из адекватных

Вариант 1: Создавать кучку воркеров через ThreadPoolExecutor, закидывать им очередь урлов
Вариант 2: aiohttp, создавать кучку тасков-воркеров, закидывать им очередь (asyncio.Queue) урлов
Вариант 3: aiohttp, запускать все 30к одновременно, с помощью asyncio.Semaphore задавать, сколько максимум может быть запросов одновременно

Вариант №3 самый простой в реализации и оптимальный. Примерно на 15 строк кода. Но будет кушать чуть больше памяти, чем вариант 2. Вариант 1 самый тяжёлый из-за того, что каждый тред в ОС будет кушать примерно по 2мб памяти, зато синхронный.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽