shabelski89
@shabelski89
engineer

Бесконечный цикл в отдельном потоке python telebot?

Имеем вот такой код:

from config import URL, PROXY, TOKEN
import telebot
from sqlite_module import *
import time
from threading import Thread


telebot.apihelper.proxy = {'https': PROXY}
bot = telebot.TeleBot(TOKEN)

# Пользователь регистрируется в БД по UID и пишет название сериала, запрос обрабатывается в БД при наличии совпадений сериал/ы добавляются в таблицу favorites для этого юзера.
# Тут вопрос использования цикла, для добавления нескольких сериалов подряд
 
@bot.message_handler(commands=['start'])
def start(message):
    tupp = (message.from_user.id, message.from_user.username, message.from_user.first_name, message.from_user.last_name, time.ctime())
    send_user_info(tupp)
    send = bot.send_message(message.from_user.id, 'What series do you search?')
    bot.register_next_step_handler(send, add_to_fav)


def add_to_fav(message):
    msg = search_in_db(message.text, message.from_user.id)
    if msg == 'No match found':
        bot.send_message(message.from_user.id, msg)
    else:
        text = '@' + message.from_user.username + ' ' + 'Next series added to favorites: '
        bot.send_message(message.from_user.id, text)
        for elem in msg:
            bot.send_message(message.from_user.id, elem[1] + ': ' + elem[2])

# хендлер по команде сделает запрос в БД и вернет список серий для юзера при наличии
@bot.message_handler(commands=['show'])
def show(message):
    # print(message)
    # print(type(message))
    msg = show_user_info(message.from_user.id)
    if msg == 'No series in favorites':
        bot.send_message(message.from_user.id, msg)
    else:
        text = '@' + message.from_user.username + ' ' + 'List favorites series: '
        bot.send_message(message.from_user.id, text)
        for elem in msg:
            bot.send_message(message.from_user.id, elem[0] + ': ' + elem[1])


# хендлер по команде запускает функцию в отдельном потоке, для цикличной проверки обновлений вышедших серий
@bot.message_handler(commands=['check'])
def download(message):
    bot.register_next_step_handler(message, thread_loop)

# запускаю в отдельном потоке задачу
def thread_loop(message):
    Thread(target=main_body, args=(message,)).start()

# тут вызывается цикл следящий за апдейтом RSS ленты, при обновлении формирует словарь {сериал: ссылка} и отправляет на скачивание
def main_body(message):
    last_update = ''
    while True:
        if last_update != parsing_rss(URL).updated:
            last_update = parsing_rss(URL).updated
            d = parsing_rss(URL)
            result_parsing = d.entries
            series_list = {search_block_symbols(x['title']): x['link'] for x in result_parsing if x['tags'][0]['term'] == '[MP4]'}
            series_list_name_en = {key[key.find('(') + 1:key.find(')')]: value for key, value in series_list.items()}
            check_rss_in_fav(series_list_name_en, message.from_user.id)
            time.sleep(3600)
        else:
            time.sleep(3600)

#да да, пока что ещё лонг поллинг, к веб хукам позже.

if __name__ == '__main__':
    bot.polling(none_stop=True)


Модуль sqlite_module содержит функции создания / проверки в ДБ, парсинг RSS и скачивания.
Если убрать telebot, то цикл и все функции работаю как надо. Добавление юзера и списка серий, проверка апдейта и скачка.

Подскажите куда правильно смотреть, и если уж читаете за перерывом на кофе, то надеюсь вы не облились при виде кода) Нужно чтобы функция проверки жила "отдельно" от остальных хендлеров и могла вызываться для каждого юзера отдельно.
  • Вопрос задан
  • 2906 просмотров
Решения вопроса 1
@shapick
import threading

def async_function():
threading.Timer(5.0, f).start() # Перезапуск через 5 секунд
print("Hello, world!")

async_function()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shabelski89
@shabelski89 Автор вопроса
engineer
Отдельным потоком запуск функции я реализовал, но вот так чтобы передавать message из хендлера в поток не ясно :(
Ответ написан
Ваш ответ на вопрос

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

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