Задать вопрос
@allresize

Что не так с моими асинхронными запросами?

У меня есть бот который взаимодействует с 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
  • Вопрос задан
  • 62 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы