@newPsevdonim
Python разработчик

Как правильно настроить многопоточность у бота telegram?

Есть бот в телеграм, который выполняет работу с файлами. При его написании допустил ошибку и забыл про многопоточность из-за чего возникают ошибки в работе из-за того, что у разных пользователей разные директории и процессы обработки файлов занимают достаточно много времени и т.д. При написании была использована библиотека pyTelegramBotAPI. Есть ли в ней методы, которые отвечают за многопоточность? Про библиотеку threading знаю, код бота достаточно большой и очень не хочется его переделывать.

ДОПОЛНЕНИЕ
Вот одна небольшая часть кода:
@bot.message_handler(commands=['start'])
def start(message):

    # keyboard
    markup1 = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton("Видео")
    item2 = types.KeyboardButton("Аудио")
    item3 = types.KeyboardButton("Завершить")
    item4 = types.KeyboardButton("/start")
    item5 = types.KeyboardButton("Добавить файлы")
    markup1.add(item1, item2).add(item3, item5).add(item4)

    start_dir = os.getcwd()

    bot.send_message(message.chat.id, "текст")
    bot.send_message(message.chat.id, "текст")
    bot.send_message(message.chat.id, "текст", reply_markup=markup1)

    database.registration_user(message.from_user.id, message.from_user.first_name, message.from_user.last_name)
    derect_function.creat_vid_dir(message.from_user.id)
    derect_function.creat_aud_dir(message.from_user.id)
    derect_function.creat_com_dir(message.from_user.id)
    derect_function.creat_img_dir(message.from_user.id)
    derect_function.creat_res_dir(message.from_user.id)
    if database.select_status_of_usages(message.from_user.id) == 0:
        derect_function.delete_file_in_vid_dir(message.from_user.id)
        derect_function.delete_file_in_aud_dir(message.from_user.id)
        derect_function.delete_file_in_img_dir(message.from_user.id)
        derect_function.delete_file_in_res_dir(message.from_user.id)
        derect_function.creat_command_file(message.from_user.id)
    if user_id not in database_for_google.select_user_id():
        google_program.start_upload_file(message.from_user.id)


Это небольшая часть кода. Но там также используется bot.register_next_step_handler и как со всеми этими выводами сообщений, переходам к другим функциям и т.д работать не понятно. Понятно, что функции по обработки файлов я могу оформить, как отдельный поток, но вот что со всем остальным делать не понятно вообще.
  • Вопрос задан
  • 549 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Если коротко: пусть бот работает в главном потоке. ФЗ, синхронно или асинхронно, зависит от используемой библиотеки. Судя по приведённому коду, синхронно.
А вот все длительные операции запускайте в отдельных потоках или даже процессах.
Для общения между потоком бота и рабочими потоками/процессами организуйте две очереди. Из одной потоки обработки данных будут принимать задания. В другую они будут складывать сообщения для отправки (текст + id пользователя, например). Тогда основной бот должен по готовности запроса положить объект с описанием задания в первую очередь, а также периодически проверять наличие сообщений во второй. При наличии - извлекать и отправлять по назначению.
Ответ написан
Ваш ответ на вопрос

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

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