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