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