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 шт):
Насколько я понимаю, так не получится сделать.
Можно зарегистрировать только один обработчик для каждого типа контента (например, текстовые сообщения, изображения и т. д.), одним словам - каждый обработчик должен быть уникальным(насколько я понимаю, если один обработчик забрал сообщение, остальные его уже не получат).
Предлагаю при обработке сообщения в основном потоке, добавлять его в очередь 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)