@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)
  • Вопрос задан
  • 778 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Мешать многопоточность с асинхронностью - плохая идея.
А вообще зависит от реализации server.status(). Если оно делает синхронный сетевой запрос, то конечно бот встанет на время его выполнения.
Если нет асинхронной реализации, я бы запустил новый таск, который в цикле раз в минуту-две опрашивает сервер и запоминает текущий онлайн. А по команде отдавал бы только последнее запомненное значение.
В принципе можно использовать loop.run_in_executor() для выполнения потока как асинхронной задачи. Это более-менее безопасно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы