Answer the question
In order to leave comments, you need to log in
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: Создавать кучку воркеров через 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 questionAsk a Question
731 491 924 answers to any question