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