Задать вопрос
@Paymir121

Как запустить несколько ботов в докере?

Задача: запустить много ботов в одном докере.
При запуске локально на винде или маке, то все нормально запускается и работает как и предсказывается
Но при запуске в докере выдается ошибка:
backend1-1  |   File "uvloop/loop.pyx", line 2887, in uvloop.loop.Loop.add_signal_handler
backend1-1  |     raise ValueError(
backend1-1  | ValueError: add_signal_handler() can only be called from the main thread

После экспериментов с многопоточностью и различными вариантами кода, то понял что сам докер блокирует все потоки

class BaseTelegramBot:
    """Основа телеграмм Бота"""

    def __init__(self, bot_data):
        super().__init__()
     self.bot = Bot(token=self.token)
     self.dispatcher = Dispatcher()

bot = BaseTelegramBot(bot_data=bot_data)
asyncio.run(bot.start())  

async def start(self):
        py_logger.info(f"Бот стартовал {self.bot_data.id}")
        await self.bot.set_my_commands(commands=self.commands)
        await self.dispatcher.start_polling(self.bot)

проект open source:
Как запустить множество ботов в докере?
  • Вопрос задан
  • 318 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 4
fenrir1121
@fenrir1121
Начни с документации
Задача: запустить много ботов в одном докере.
Где докер файл, которым ты решаешь эту задачу? Что значит в одном докере? В одном контейнере? Зачем?

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

Наиболее предсказуемый вариант разворачивать ботов независимо друг от друга. Если им нужно какое-то общение между собой это реализуется другими средствами: общей БД, реплицированным кэшем, брокерами сообщений и прочими, но никак не запуском в одном процессе.
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Вместо разных потоков используй разные процессы
Ответ написан
Комментировать
2ord
@2ord
Запускай 1 бот на 1 контейнер.
Код один. Экземпляров - сколько необходимо. (того же контейнера).
Переделывать нет нужды. Один процесс на каждый экземпляр. Вот и все.

https://thelinuxcode.com/scale-services-in-docker-...
Ответ написан
@Paymir121 Автор вопроса
получение текущего добавление и добавление в него таска сработало.
asyncio.get_event_loop().create_task(bot.start(), name=f"start_{bot_id}")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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