|
|
|
@ -59,24 +59,34 @@ async def get_records_count(session, server) -> int:
|
|
|
|
|
return count |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_tasks(cfg: Config, session: aiohttp.ClientSession, count, body) -> list: |
|
|
|
|
"""Вернет список запросов к API. |
|
|
|
|
async def get_tasks( |
|
|
|
|
url: str, portion: int, count: int, session: aiohttp.ClientSession, body: dict |
|
|
|
|
) -> List[Task]: |
|
|
|
|
"""Вернет список задач с запросами к API. |
|
|
|
|
|
|
|
|
|
Функция не ограничивает кол-во запросов, это нужно сделать до |
|
|
|
|
вызова, чтобы передать корректный `session`. |
|
|
|
|
|
|
|
|
|
Parameters |
|
|
|
|
---------- |
|
|
|
|
url : str |
|
|
|
|
Куда слать запрос. Ожидается "server/get" |
|
|
|
|
portion : int |
|
|
|
|
Сколько записей запрашивать за раз |
|
|
|
|
count : int |
|
|
|
|
Общее количество записей |
|
|
|
|
session : aiohttp.ClientSession |
|
|
|
|
Объект сессии, создается в уровне выше, с одним объектом |
|
|
|
|
меньше накладных расходов на каждый запрос. |
|
|
|
|
body : json |
|
|
|
|
Json для запроса. |
|
|
|
|
""" |
|
|
|
|
tasks: List[Task] = [] |
|
|
|
|
offset = 0 |
|
|
|
|
url = f"{cfg.central_host_url}/get" |
|
|
|
|
|
|
|
|
|
for _ in range(count // cfg.request_portion + 1): |
|
|
|
|
if offset < count: |
|
|
|
|
print(f"{offset=}") |
|
|
|
|
tasks.append(asyncio.create_task(session.get(url, json=body))) |
|
|
|
|
offset += cfg.request_portion |
|
|
|
|
body["offset"] = offset |
|
|
|
|
for offset in range(0, count, portion): |
|
|
|
|
tasks.append(asyncio.create_task(session.get(url, json=body))) |
|
|
|
|
body["offset"] = offset |
|
|
|
|
|
|
|
|
|
print(f"{count=}") |
|
|
|
|
return tasks |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -87,14 +97,19 @@ async def send_async_request(cfg: Config, json_body: dict) -> None:
|
|
|
|
|
# ограничим одновременное число запросов |
|
|
|
|
conn = aiohttp.TCPConnector(limit=cfg.requests_count) |
|
|
|
|
|
|
|
|
|
url = cfg.central_host_url |
|
|
|
|
portion = cfg.request_portion |
|
|
|
|
|
|
|
|
|
async with aiohttp.ClientSession(connector=conn) as session: |
|
|
|
|
# всего записей в базе |
|
|
|
|
count = await get_records_count(session, cfg.central_host_url) |
|
|
|
|
# получаем количесвто записей |
|
|
|
|
count = await get_records_count(session, url) |
|
|
|
|
|
|
|
|
|
tasks = await get_tasks(cfg, session, count, json_body) |
|
|
|
|
tasks = await get_tasks(f"{url}/get", portion, count, session, json_body) |
|
|
|
|
|
|
|
|
|
responses = await asyncio.gather(*tasks) |
|
|
|
|
|
|
|
|
|
# Пройдемся по ответам на запросы, запишем файлы конфига для |
|
|
|
|
# каждого respone. Каждый response содержит portion или меньше хостов |
|
|
|
|
for response in responses: |
|
|
|
|
resp = await response.json() |
|
|
|
|
hosts = [i["hostname"] for i in resp.get("result")] |
|
|
|
@ -102,8 +117,7 @@ async def send_async_request(cfg: Config, json_body: dict) -> None:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def read_config(path_to_conf_file: str, section: str = "Main") -> Config: |
|
|
|
|
""" |
|
|
|
|
Считать конфиг с помощью `configparser`. |
|
|
|
|
"""Считать конфиг с помощью `configparser`. |
|
|
|
|
|
|
|
|
|
Parameters |
|
|
|
|
---------- |
|
|
|
|