@yourcreolight

Как реализовать мульти-поточность в боте Telegram (Aiogram)?

Как исправить это: Когда много людей пишут боту команду на получение онлайна количества игроков, то последний человек получает ответ долго?

from aiogram import Bot, Dispatcher, executor, types
from mcstatus import MinecraftServer
import logging

bot = Bot(token="token")
dp = Dispatcher(bot)
server = MinecraftServer.lookup('localhost')
logging.basicConfig(level=logging.INFO)

@dp.message_handler(commands=["players"])
async def cmd_test1(message: types.Message):
	status = server.status()
	await message.reply('Онлайн сервера: ' + str(status.players.online))

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 858 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Мешать многопоточность с асинхронностью - плохая идея.
А вообще зависит от реализации server.status(). Если оно делает синхронный сетевой запрос, то конечно бот встанет на время его выполнения.
Если нет асинхронной реализации, я бы запустил новый таск, который в цикле раз в минуту-две опрашивает сервер и запоминает текущий онлайн. А по команде отдавал бы только последнее запомненное значение.
В принципе можно использовать loop.run_in_executor() для выполнения потока как асинхронной задачи. Это более-менее безопасно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
28 нояб. 2024, в 05:21
2000 руб./за проект
28 нояб. 2024, в 05:18
500 руб./за проект
28 нояб. 2024, в 03:51
3500 руб./за проект