@EugeneVKruglov

Как прекратить поток в Python?

Здравствуйте! Прошу объяснить мне, как новичку, почему я не могу прекратить выполнение потока и наоборот, запустить поток в питоне приведенным ниже способом? Задача состоит в том, чтобы выполнять некоторые фоновые действия в то время, пока работает основной функционал бота.
Из кода убрал все лишнее, оставил только проблемные части в виде тестовых функций.

import telebot
import time
import datetime
import threading

global stop_thread
stop_thread = False

#---- объявление других переменных, действия и функции

@bot.message_handler(content_types = ['text'])
def get_user_text(message):
    if message.text == '/stop_thread':
        if 'stop_thread' in globals():
            stop_thread = True
            print('Получен запрос на остановку потока')
            print('stop_thread =', stop_thread) 
            # в консоли выводится, что значение стало True, но до потока оно почему-то не доходит, 
            # внутри функции start_thread() остается False
    if message.text == '/start_thread':
        if 'stop_thread' in globals():
            stop_thread = False
        t = threading.Thread(target = start_thread)
        t.start() # запустить поток таким образом тоже не получается

#---- другие действия и функции

def start_thread():
    print(f'Начало отсчета: {datetime.datetime.utcnow()}')
    print('stop_thread =', stop_thread)
    while not stop_thread:
        print('Работает поток... stop_thread =', stop_thread)
        print(f'Прошло 3 секунды, {datetime.datetime.utcnow()}')
        time.sleep(3)

t = threading.Thread(target = start_thread)
t.start()

#---- еще действия и функции

# стартуем бота
bot.polling(non_stop = True)


При запуске по F5 все идет нормально, бот функционирует, параллельно запускается поток, который выводит тестовую распечатку в консоль. Однако изменить значение переменной stop_thread на True и остановить поток я не могу, stop_thread остается False. Как бы я ни игрался с global stop_thread, ничего не меняется. Даже завершение программы по Ctrl-C не прекращает работу потока - продолжается тестовая печать в консоль.
Большая просьба объяснить, что нужно сделать, желательно с примерами.
Спасибо!
  • Вопрос задан
  • 258 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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