Как запустить asyncio код отдельно от общего event loop'a?
Есть бот в телеграмме, который парсит сайт, на каждого пользователя создается по 40-60 тасков (для каждого элемента который надо обработать),с большим количеством пользователей бот начинает тормозить, т.е время выполнения функций возрастает, хотя все, что у меня делается в этой функции это: делается запрос через Aiohttp, обрабатывается json, и добавляется в базу данных через asyncpgти есть такое предположение, что это из-за частых переключений контекста, это и приводит к тормозам основной программы. Мне сказали чтобы решить эту проблему, нужно вынести часть работы в отдельные воркеры, но как это сделать? Мне предлагают что-то связанное с rabbitmq, но мне кажется это сложным, можно ли как то asyncio код запускать через multiprocessing? или threads?
Например у меня есть функция
parser_result = await asyncio.gather(*(
get_item_by_id(place=place, item_id=item_id, tg_user_id=chat_id,
configuration_settings=configuration_settings, user_data=user_data,
custom_text=custom_text, bot=bot, parser_key=parser_key,
tokens=tokens, user_token=user_token, access_token=access_token,
sem=asyncio.Semaphore(semaphore_amount))
for item_id in items
))
Можно ли как-то эту функцию запустить отдельно от общего event loop'a? Или в подпроцесс отдельно как-то ее? В поток? Или через ProcessPoolExecutor? Чтобы основой бот не тормозил, желательно с примером кода
Ответы (1 шт):
У вас тут немного перемешано.
На самом деле: asyncio - асинхронность, а multiprocessing или threads - два других варианта.
Общее правило:
a) много операций ввода-вывода, но они неблокирующие - используйте асинхронность.
б) много операций ввода-вывода, но они блокирующие - используйте многопоточность.
в) много вычислений - используйте многопроцессность.
Начните с того, что выберите свой вариант (можете отредактировать вопрос с указанием варианта).