должен передавать серверу page, если сервер вернул "response": [], то мне нужно прекратить выполнение цикла. Я только додумался выполнять asyncio.gather(), чтобы получить результат запроса и сделать условие. Но тогда программа выполняется на полсекунды медленнее, чем если захардкордить range до значений, где точно будет не пустой ответ. Есть ли варианты как увеличить скорость выполнения? https://pastebin.com/vPNhB7N1
если у тебя каждый следующий запрос зависит от результатов предыдущего, то это никак не ускорить
Меня смущает вызов два раза. asyncio.gather вроде выполняет переданные корутины. По сути ты выполняешь запросы отдельно на 9 строке и потом еще раз все запросы конкурентно в 13
Получается код на строках 5-11 работает синхронно
ему вообще gather не нужен в этой задаче
Если известно количество page заранее, то можно
у него решение отправлять запрос зависит от результатотв предыдущего запроса, зачем тут gather
В коде это не заметно, если нужно из запроса в запрос что-то прокидывать, то да, тут только на группы разбить по ренджам пейджей разве что
что? нет, он чекает результат запроса. если результат пустой, то запросы прекращаются, о каких ренджах речь
Если примерно известно количество страниц, то условно можно ускорить запрашивая по группам. Допустим по 10-20 страниц в таске. Если возвращается пустая страница - заканчиваем таску.
он не знает кол-во страниц, + при таком подходе будут отправляться лишние запросы и нагружать сервис
Да, я даже не подумал об этом. Убрал из 13 строки, но скорость +- одинаковая. gather в цикле много времени занимает всё же
ты знаешь вообще зачем gather нужен?
Ну тогда последовательно только. Да и лишних запросов будет не так много - по колличеству групп максимум. Если сервис развалиться от нескольких лишних сообщений, то это печально.
я думаю должно быть предусмотрено что то типо items_by_page при вызове api
я читал статью, в которой использовался этот код, сравнил - стало лучше. Но до этого я просто использовал requests и всё. https://www.twilio.com/blog/asynchronous-http-requests-in-python-with-aiohttp
Есть документация API в которую ты стучишься? Может с ней что-то конкретное получится посоветовать
gather нужен когда тебе надо несколько корутин выполнить конкурентно, а ты в цикле после каждого запроса его вызываешь, когда корутина всего одна. ТО есть выполняешь последовательно код, gather лишний
сервис полный шлак, к большому сожалению
то есть просто await some_func() будет лучше?
Тогда если тебе не известно сколько страниц и сервис хреновый, то нет большого смысла запрашивать асихронно, так как есть шанс положить его. Особенно без рейт лиметера и ретраев.
он и синхронно падает через раз xD
я бы как то так сделал https://pastebin.com/eVytLcTz
Тогда синронно с exponential backoff ретраями. Быстро не выдет
Это же по сути синхронный код, который в асихнроном коде может быть вызван
Обсуждают сегодня