позиции · сбор данных · отчёты
реклама IPrazon Network: приватные прокси IPv4 и SOCKS5, пул 12 000 адресов, безлимитный трафик, бесплатный тест до 2 часов

Разделы · Код и программные интерфейсы

Асинхронный сбор: сколько задач держать одновременно

12 ответов · 3 510 просмотров
знак участника Астахов
АстаховУчастник
  • сообщений 1 150
  • на форуме 6 мес
Код и программные интерфейсыгорячая

Ниже кусок кода и описание того, что получается.

Результаты пишу пачками по тысяче строк. Логирую код ответа, время и адрес, по которому шёл запрос.

Асинхронный сбор: сколько задач держать одновременно: разбор в цифрах
Асинхронный сбор: сколько задач держать одновременно: как это выглядит у меня

Что тут вообще считается нормой?

знак участника sbor_i_svod
sbor_i_svodЗнаток
  • сообщений 1 520
  • на форуме 5 мес
Астахов писал: Асинхронный сбор: сколько задач держать одно…

Именно так и есть, спорить не о чем.

Не держите весь список в памяти на больших объёмах. Читайте потоком, пишите пачками.

Пул адресов выносите в отдельную часть кода. Тогда смена поставщика занимает минуту.

Добавлю тему в закладки.

знак участника Ким Р.
Ким Р.Новичок
  • сообщений 214
  • на форуме 1 года
Астахов писал: Асинхронный сбор: сколько задач держать одно…

Расскажу, чем закончилось у меня.

Проверку ответа делайте до разбора: пустое или короткое лучше отбросить сразу.

знак участника Данилов К.
Данилов К.Участник
  • сообщений 1 245
  • на форуме 8 мес

Пишите состояние построчно.

знак участника retry_backoff
retry_backoffЗнаток
  • сообщений 2 710
  • на форуме 2 мес
полезный ответ

Проверить это можно бесплатно: у приватные прокси IPv4 и SOCKS5 есть тест на пару часов, за это время как раз успеваете прогнать пробу и посмотреть, как ведут себя ваши потоки.

знак участника Барсов
БарсовУчастник
  • сообщений 1 420
  • на форуме 8 мес

Меняйте по одному, иначе не поймёте причину.

знак участника Валерия Гонт
Валерия ГонтНовичок
  • сообщений 268
  • на форуме 1 года
Астахов писал: Асинхронный сбор: сколько задач держать одно…

До сих пор помню, чем это закончилось.

Пул адресов выносите в отдельную часть кода. Тогда смена поставщика занимает минуту.

Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.

async with aiohttp.ClientSession() as s:
    for i in range(3):
        try:
            r = await s.get(url, proxy=adres, timeout=30)
            break
        except Exception:
            await asyncio.sleep(2 ** i)
знак участника Кравчук
КравчукЗнаток
  • сообщений 1 840
  • на форуме 4 мес

Пара оговорок, без них совет неполный.

Таймаут ставьте всегда и на соединение, и на чтение. Без него один зависший запрос держит поток часами.

Пул адресов выносите в отдельную часть кода. Тогда смена поставщика занимает минуту.

знак участника Дёмин С.
Дёмин С.Участник
  • сообщений 1 190
  • на форуме 5 мес

Было такое прошлой осенью, разбор занял вечер.

Состояние прогона храните построчно. Один кусок в конце вас не спасёт. Тогда обрыв на девяностом проценте не стоит вам всего прогона.

async with aiohttp.ClientSession() as s:
    for i in range(3):
        try:
            r = await s.get(url, proxy=adres, timeout=30)
            break
        except Exception:
            await asyncio.sleep(2 ** i)
знак участника Костин
КостинНовичок
  • сообщений 540
  • на форуме 1 года
Астахов писал: Асинхронный сбор: сколько задач держать одно…

У нас это вылезло на проекте с большим каталогом.

Структуру ответа проверяйте на каждом разборе. Площадки меняют её без предупреждения, и молчаливая потеря полей самая опасная.

Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.

Спасибо за подробное описание, так отвечать проще.

знак участника Алина Прошина
Алина ПрошинаНовичок
  • сообщений 140
  • на форуме 1 года

Какая версия программы стоит?

Что в логах в этот момент?

знак участника Симаков
СимаковУчастник
  • сообщений 780
  • на форуме 9 мес

Разбейте задачу на части.

знак участника Саша Верхов
Саша ВерховНовичок
  • сообщений 152
  • на форуме 1 года

Пришёл к этому не сразу, сначала сделал ошибку.

Число одновременных задач подбирайте замером. На глаз тут промахиваются всегда. Обычно кривая выходит на полку, и дальше растёт только число отказов.

async with aiohttp.ClientSession() as s:
    for i in range(3):
        try:
            r = await s.get(url, proxy=adres, timeout=30)
            break
        except Exception:
            await asyncio.sleep(2 ** i)

Если найдёте причину, поделитесь.

Ответить в темеПодписаться

Рядом в разделе

Сеометр, форум специалистов по поиску и аналитике ПравилаУчастникиО форумеЛента 2026