Как сделать очередь на функцию, используя Aiogram Python?

Рейтинг: 0Ответов: 1Опубликовано: 05.04.2023

Интерпретирую чат-бота бинг в телеграм при помощи библиотек EdgeGPT и Aiogram. Когда несколько пользователей отправляют одну команду, она срабатывает у последнего, прерывая первого (библиотека выдает ошибку, когда работающий метод вызывается ещё раз). Я хочу, чтобы у последнего она срабатывала после первого, не замораживая бота. Нужно что-то типо очереди. Буду очень благодарен.

@dp.message_handler()
async def use(message: types.Message):
    msg = await bot.send_message(message.chat.id, WAIT_MESSAGE, parse_mode=ParseMode.HTML)

    try:
        # создаем запрос в бинг
        result = await bing.ask(prompt=message.text, wss_link="wss://sydney.bing.com/sydney/ChatHub")
        # переобразовываем данные в текст
        result = result['item']['messages'][1]['text']
        await bot.edit_message_text(result, message.chat.id, msg["message_id"], parse_mode=ParseMode.MARKDOWN)
    
    except Exception as e:
        print('(!) Error: ' + str(e))
        await bot.edit_message_text(ERROR_MESSAGE, message.chat.id, msg["message_id"], parse_mode=ParseMode.MARKDOWN)
    
    await bing.reset()
    await bing.close()

Ответы

▲ 0Принят

Что не вызывать метод одновременно достаточно использовать asyncio.Lock:

lock = asyncio.Lock()

@dp.message_handler()
async def use(message: types.Message):
    msg = await bot.send_message(message.chat.id, WAIT_MESSAGE, parse_mode=ParseMode.HTML)

    try:
        async with lock:
            # создаем запрос в бинг
            result = await bing.ask(prompt=message.text, wss_link="wss://sydney.bing.com/sydney/ChatHub")
        # переобразовываем данные в текст
        result = result['item']['messages'][1]['text']
        ...