@NoKit

Как реализовать потоки выполнения сопрограм бота?

Всем привет!

Разбираюсь с многопоточностью и асинхронностью. Цель простая, у бота есть асинхронные методы с состоянием. Хочу чтобы ботом могли одновременно пользоваться несколько юзеров. Для этого решил реализовать многопоточный запуск бота.

Опробовал разные способы, но бот либо не запускается, либо не создает потоки при обращении от нескольких пользователей одновременно. Помогите разобраться, что не так?

Основной код:
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
import logging
import threading
from aiogram import Bot, Dispatcher, executor
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from state_t import register_handlers_choose
import keyboards_t


logger = logging.getLogger(__name__)
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
)
logger.error("Starting bot")
bot = Bot(token="")
dp = Dispatcher(bot, storage=MemoryStorage())

async def worker(dp):
    register_handlers_choose(dp)

async def main(dp):
    futures = [loop.run_in_executor(executor, worker, dp)]
    await asyncio.gather(*futures)
    await dp.start_polling()
    await keyboards_t.set_default_commands(dp)

if __name__ == '__main__':
    start = time.perf_counter()
    executor = ThreadPoolExecutor(max_workers=3)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(dp))


Методы:
import time
from aiogram import Dispatcher, types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
import keyboards_t as kb



class States(StatesGroup):
    w_do = State()

async def start(message: types.Message):
    await message.answer(f"Даров, начнем?", reply_markup=kb.do_menu)
    await States.w_do.set()

async def dodo(message: types.Message, state: FSMContext):
    i = 0
    while i < 20:
        i += 1
        logger.info(time.perf_counter())
        await message.answer(f"{i}")
        time.sleep(5)


async def cmd_cancel(message: types.Message, state: FSMContext):
    await state.finish()
    await message.answer("Отмена", reply_markup=kb.do_menu)

def register_handlers_choose(dp: Dispatcher):
    dp.register_message_handler(start, commands="start", state="*")
    dp.register_message_handler(cmd_cancel, commands="cancel", state="*")
    dp.register_message_handler(dodo, state=States.w_do)
  • Вопрос задан
  • 600 просмотров
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Во-первых, в принципе не стоит смешивать асинхронность с многопоточностью. Во-вторых, вам этого и не нужно, aiogram для того асинхронным и разработан, чтобы его могли использовать несколько юзеров одновременно. Для этого достаточно код правильно написать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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