У меня есть бот который взаимодействует с api.
В коде что я представил:
1. класс Requester - моя попытка переделать запросы на асинхронные с ограничением 20 в сек.
2. Функция которая ждет от api список id и повторяет запрос несколько раз если сервис возвращает не полный список в csv.
Теперь я вижу какое то странное поведение - запрос может отправиться сразу, а может зависнуть на несколько минут. Если запрос ожидает 10 id все нормально работает, а если должно прийти 100 id - то я могу ждать целую минуту (до переделок нормально работало)
Что я сделал не так? как будто запрос при 100 id заклинивает. Может потому что при 10 сервис сразу грузит, а при 100 может понадобиться вторая попытка запроса.
class Requester:
def __init__(self, max_per_second: int = 20):
self.limiter = AsyncLimiter(max_per_second, 1.0)
self.client = httpx.AsyncClient(timeout=30.0)
async def get(self, url, **kwargs):
async with self.limiter:
response = await self.client.get(url, **kwargs)
print(response.text)
return response.text
async def post(self, url, **kwargs):
async with self.limiter:
response = await self.client.post(url, **kwargs)
print(response.text)
return response.text
async def close(self):
await self.client.aclose()
async def get_call_ids(self, phonelist_id, country, need_len):
url = (f"https://zvonok.com/manager/cabapi_external/api/v1/phonelists/call_ids_by_phonelist/"
f"?public_key={s.d[f'zvonok_api_{country}']}"
f"&campaign_id={s.d[f'zvonok_id_{country}']}"
f"&phonelist_id={phonelist_id}")
logger.info(f"Получение call_ids. {phonelist_id} {country} {url}")
tryes = 15
while tryes:
try:
print('отправка получения ид')
resp = await self.requester.get(url)
print('ид получены')
if resp:
f = StringIO(resp)
data = []
reader = csv.DictReader(f)
for row in reader:
data.append([row['phoneval'], row['ats_call_id']])
if len(data) < need_len:
if tryes == 1:
logger.info(f"Возврат меньшего количества номеров {len(data)}")
return data
logger.info(f"В ответе не все номера - {len(data)} из {need_len}")
await sleep(3)
raise Exception
except Exception as e:
traceback.print_exc()
tryes -= 1
return False