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)
  • Вопрос задан
  • 372 просмотра
Решения вопроса 1
@deliro
Из адекватных

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

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

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

Похожие вопросы