S
S
Sergey Alekseev2020-03-17 15:42:49
Python
Sergey Alekseev, 2020-03-17 15:42:49

Python how to ping many hosts?

Good afternoon, there is a task to take urls and ping, that is, to check if hosts are available. It is necessary to check let's say 30,000 hosts within a minute. What approaches can be used?
I've tried using the requests-futures library, but that's not enough.

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)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
R
Roman Kitaev, 2020-03-17
@serj2000

Из адекватных
Вариант 1: Создавать кучку воркеров через ThreadPoolExecutor, закидывать им очередь урлов
Вариант 2: aiohttp, создавать кучку тасков-воркеров, закидывать им очередь (asyncio.Queue) урлов
Вариант 3: aiohttp, запускать все 30к одновременно, с помощью asyncio.Semaphore задавать, сколько максимум может быть запросов одновременно
Вариант №3 самый простой в реализации и оптимальный. Примерно на 15 строк кода. Но будет кушать чуть больше памяти, чем вариант 2. Вариант 1 самый тяжёлый из-за того, что каждый тред в ОС будет кушать примерно по 2мб памяти, зато синхронный.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question