@Emince

Почему скорость работы асинхронного кода снижается?

Есть скрипт, который проверяет данные доменов (ip, NS, редиректы и т.д.) и записывает их в БД mysql. При запуске скорость работы одна, но при проверке 10 тыс. доменов скорость начинает снижаться, при достижении 100 тыс., скорость очень сильно падает. Ниже код main(), думаю, одна из причин там. Прошу указать на моменты, над которыми надо по работать.

async def main():
    agent = {
        'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/81.0.4044.138 Safari/537.36'}
    pool = await aiomysql.create_pool(host='localhost', user='user', password='user', db='db')
    geo_ip = 'geo_ip/IP2LOCATION-LITE-DB1.CSV'
    filename = 'urls.txt'
    app_storage['session'] = ClientSession()

    with open(geo_ip, mode='r', encoding='utf-8') as file:
        csv_reader = csv.reader(file)
        next(csv_reader)
        data_ip = list(csv_reader)

    async with ClientSession() as session:
        await create_table(pool)

        async with aiofiles.open(filename, 'r', encoding='utf-8') as file:
            domains = [line.strip() for line in await file.readlines()]
            current_date = datetime.datetime.now().strftime('%d-%m-%Y')
            sem = asyncio.Semaphore(120)
            tasks = []
            for domain in domains:
                tasks.append(get_domain_ip(sem, domain, pool, data_ip, current_date, agent))

            for task in tqdm(asyncio.as_completed(tasks), total=len(tasks)):
                await task


if __name__ == '__main__':

    conn = http.client.HTTPConnection("ifconfig.me")
    conn.request("GET", "/ip")
    print(f'Work IP - {conn.getresponse().read().strip()}')

    if sys.platform.startswith('win'):
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    else:
        asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy())
    asyncio.run(main())
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Скажи, о каких скоростях идет до и после повышения количества доменов?
Что показывает нагрузка на процессор (асинхронный код использует в основном только одно ядро).

Добавь подсчет количества запросов в секунду на каком то разумном интервале (например 1..10сек), по коду это просто переменная, которую увеличиваешь на 1 с каждым запросом и сбрасываешь, если остаток от деления текущего времени в timestamp на интервал в секундах изменилось, с последнего вывода, ну и выводишь значение переменной, поделив на этот же интервал.

И главный вопрос, а с чего ты взял что сайт ifconfig.me будет отвечать тебе с бесконечной скоростью? Почти наверняка ты упираешься в какие то лимиты и тебе понижают количество запросов в секунду, через некоторое время лимит сбрасывается и твои тесты с малым количеством запросов работают быстрее.
Ответ написан
Ваш ответ на вопрос

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

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