Пачками потому, что вы лечите последствие. Пауза с ростом это разбор уже случившегося отказа, а частоту запросов у вас по-прежнему никто не держит.
Нужен ограничитель на своей стороне, общий на все потоки. Обычная схема с корзиной: в корзину капают талоны с нужной частотой, поток перед запросом забирает один, корзина пуста, значит ждёт. Тогда вы просто не выходите за лимит и 429 не видите вовсе.
import time, threading
class Korzina:
def __init__(self, v_sekundu, zapas):
self.tempo = v_sekundu
self.zapas = zapas
self.est = zapas
self.metka = time.monotonic()
self.zamok = threading.Lock()
def vzyat(self):
while True:
with self.zamok:
seychas = time.monotonic()
self.est = min(self.zapas, self.est + (seychas - self.metka) * self.tempo)
self.metka = seychas
if self.est >= 1:
self.est -= 1
return
spat = (1 - self.est) / self.tempo
time.sleep(spat)
korzina = Korzina(v_sekundu=8, zapas=16)
```
Ставьте частоту процентов на двадцать ниже допустимой и держите корзину одну на процесс. Если процессов несколько, счёт ведите в общем месте, иначе каждый будет уверен, что укладывается, а площадка увидит сумму.