python, питон - Работает только один поток

пишу бота для телеграма и хочу сделать чтобы один поток отправлял сообщения, а второй принимал. Но каждый раз работает только один поток. Просьба решить проблему и объяснить почему так происходит.

import telebot
import threading
 # ... много кода ...

        class start_to_handler():
        def from_bot():
            @bot.message_handler(content_types=['text'])
            def get_text_message(message):
                print(message.text)
                
        def to_bot(text):
            @bot.message_handler(content_types=['text'])
            def send_message(message):
                bot.send_message(message.from_user.id,str(text))
    
    THREAD_HADLER_FROM_BOT = threading.Thread(target=start_to_handler.from_bot)
    THREAD_HADLER_TO_BOT = threading.Thread(target=start_to_handler.to_bot, args=('lol',))
    
    
    THREAD_HADLER_FROM_BOT.start()
    THREAD_HADLER_TO_BOT.start()
    THREAD_HADLER_FROM_BOT.join()
    THREAD_HADLER_TO_BOT.join()

Ответы (1 шт):

Автор решения: Amgarak

Насколько я понимаю, так не получится сделать.

Можно зарегистрировать только один обработчик для каждого типа контента (например, текстовые сообщения, изображения и т. д.), одним словам - каждый обработчик должен быть уникальным(насколько я понимаю, если один обработчик забрал сообщение, остальные его уже не получат).

Предлагаю при обработке сообщения в основном потоке, добавлять его в очередь Queue() и уже во втором потоке забирать сообщения из собственной очереди и отвечать на него.

Вижу это примерно так:

import telebot
import threading
from queue import Queue

bot = telebot.TeleBot("TOKEN")

# Очередь входящих сообщений
message_queue = Queue()

@bot.message_handler(content_types=['text'])
def get_text_message(message):
    print(message.text)
    # Передаем в функцию id чата и наше ответное сообщение
    send_message(message.from_user.id, "Привет, это второй поток, я работаю!")

def send_message(chat_id, text):
    # Добавляем id чата и наше ответное сообщение в очередь для последующей обработки во втором потоке 
    message_queue.put({'chat_id': chat_id, 'text': text})

def send_messages():
    while True:
        # Забираем сообщение из очереди
        message = message_queue.get()
        # Отправляем сообщение
        bot.send_message(message['chat_id'], message['text'])
        # Помечаем сообщение как обработанное в очереди
        message_queue.task_done()

# Запускаем второй поток для отслеживани очереди входящих сообщений
send_thread = threading.Thread(target=send_messages)
send_thread.daemon = True
send_thread.start()

# Наш основной поток 
bot.polling(none_stop=True)
→ Ссылка