парсят одну страницу и в асинке получают данные для разных значений на ней, а я хочу, чтобы одновременно парсились несколько страниц.
Как мне это сделать?
Примерный код :
async def get_html(s, l): # получаем ответ от сайта
return await s.get('https://google.com/order/' + str(l))
if __name__ == "__main__":
s = requests.Session()
loop = asyncio.get_event_loop()
for l in range(0, 1000000, 1): # здесь хочу в асинк закинуть цикл, а как - не знаю :(
response = loop.run_until_complete(get_html(s, l))
soup = BeautifulSoup(response.content, "html.parser")
orders_info(soup) # обработка с супом каждого из сайтов
loop.close()
to_thread для синхронного кода + gather для нескольких to_thread - все в asyncio docs смотри
нашел такое, но все равно не понимаю, как потоку передавать границы цикла :( можешь подсказать пж?
Это старый способ, смотри asyncio.to_thread
7 ему уже, в сыновья мне этот вопрос годится
Могу ошибаться, но тебе нужно нечто вроде await asyncio.gather(asyncio.to_thread(to_db, some_data[from:to]), asyncio.to_thread(to_db, some_data[other_from:other_to]))
Если to_db синхронный, а так можно await asyncio.gather(async_to_db(some_data), async_to_db(some_other_data))
Что за to thread
Что за async to sync
Наоборот, зырь: https://docs.python.org/3/library/asyncio-task.html#id10
Ок. Это типа замена run in executor
Круто, да? Я был рад, когда это увидел (надо было синхронную либу использовать) P.S. А рад я был, потому что советы были практически десятилетней давности и внешний вид у них оставляет желать лучшего
Не очень круто. Лучше присмотреться к run in executor, ты же не хочешь миллион тредов
Run in executor это как-то решает?
Thread pool executor слышал?
Ты написал так, будто Executor тебе не сделает миллион тредов (на миллон блокирующих функций как я понял)
Слышал, но не юзал еще
Дефолтные экзекьюторы не делают
Обсуждают сегодня