Разделы · Код и программные интерфейсы
Код рабочий, но ведёт себя не так, как я задумывал.
Сначала обстановка, вопрос в конце.
На тысяче запросов всё ровно, на ста тысячах начинается расхождение. Логирую код ответа, время и адрес, по которому шёл запрос.
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)
Хочется услышать цифры от практиков.
Уменьшите потоки вдвое и замерьте заново.
Присоединяюсь, схема рабочая.
Таймаут ставьте всегда и на соединение, и на чтение. Без него один зависший запрос держит поток часами.
Логируйте код ответа, время и адрес. Три поля, и почти любой разбор потом занимает минуты.
Был похожий случай, разбирали неделю.
Планировщик системы проще своей очереди, пока задач мало. После полусотни задач своя очередь окупается.
Число одновременных задач подбирайте замером. На глаз тут промахиваются всегда. Обычно кривая выходит на полку, и дальше растёт только число отказов.
Мы упирались в то же, пока не поменяли подход.
Состояние прогона храните построчно. Один кусок в конце вас не спасёт. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
Отпишитесь, что получилось.
Смотрите подсети, число адресов само по себе мало что даёт.
Смотрите подсети, число адресов само по себе мало что даёт.
Ловил это дважды, оба раза по разным причинам.
Адрес выбирайте по кругу с пропуском тех, что в отказе. Случайный выбор даёт перекос, кому-то достанется втрое больше запросов.
Не гоните с первого дня, дайте себе запас.
Мы держали старую схему год, зря.
Состояние прогона храните построчно. Один кусок в конце вас не спасёт. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
Ошибки разделяйте по типам. Отказ по сети и отказ площадки требуют разного поведения.
Мы держали старую схему год, зря.
Состояние прогона храните построчно. Один кусок в конце вас не спасёт. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
Не держите весь список в памяти на больших объёмах. Читайте потоком, пишите пачками.
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)Какие паузы между запросами?
До этого работало? Что менялось перед тем, как сломалось?
Набор новых участников сейчас приостановлен. Читать форум можно без учётной записи, все темы открыты.
Когда набор откроют, объявление появится в разделе с короткими вопросами.
Форма работает в браузере и никуда ничего не отправляет.