@hagnoherze

Остановить поток. Прекратить выполнять задачу?

При нажитии на кнопку выполняется код.
def job1():
    print("Work job1")
def job2():
    print("Work job2")

def run():
    schedule.every(1).minutes.do(job1)
    schedule.every(10).seconds.do(job2)
 
    while True: 
        schedule.run_pending() 
        time.sleep(1)
 
thread = Thread(target=run)
thread.start()

Нужно добавить кнопку, которая прекращает вывод job2.
  • Вопрос задан
  • 199 просмотров
Решения вопроса 1
@SaShATeR
Вы можете остановить цикл командой break: указываете условие, при котором надо остановить вывод job2 и прерываете цикл.

while True:
schedule.run_pending()
time.sleep(1)
if условие прерывания цикла:
break

Но в этом случае остановится вывод как job2, так и job1. Если нужно перестать выводить только job2, то создаете два модуля: один для job1, другой для job2.

def run1():
schedule.every(1).minutes.do(job1)

while True:
schedule.run_pending()
time.sleep(1)

def run2():
schedule.every(10).seconds.do(job2)
while True:
schedule.run_pending()
time.sleep(1)
if условие прерывания цикла:
break
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Используй threading.Event.
import threading

def run(stop: threading.Event):
  while not stop.wait(timeout=1.0): # ожидание и проверка сигнала о завершении
    schedule.run_pending()

stop_event = threading.Event()
worker = threading.Thread(target=run, args=(stop_event,))
worker.start()
#когда надо остановить поток worker
stop_event.set()

Прелесть такого подхода в том, что цикл прервётся немедленно по сигналу stop_event, а не тогда, когда закончится очередное ожидание. Также можно заставить несколько потоков использовать один и тот же объект Event.
Ответ написан
Ваш ответ на вопрос

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

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