Как завершить предыдущую функцию из schedule?
сегодня в руки попался огромный проект. У меня там возник ступор с schedule. Я сейчас не буду приводить код оттуда, потому что он реально огромный. Я написал простой код, чтобы вы немного поняли о чем я.
import schedule
import time
from threading import Thread
def printing(num):
print(num)
def schedule_checker():
while True:
schedule.run_pending()
time.sleep(1)
while True:
num = input("")
schedule.every(2).seconds.do(lambda:printing(num))
sch = Thread(target=schedule_checker)
sch.start()
Тут просто бесконечно можно вводить числа, после этого будет выполняться каждые 2 секунды функция которая выводит то число которое мы ввели (будет выполняться в отдельном потоке). Думаю вы сами поняли код и без моего глупого объяснения. Проблема тут в том, что если я введу к примеру в первый раз 1, то все ок, 1 будет выводиться каждые 2 секунды. Если же я введу к примеру 5, то первая функция (вывод числа 1) не прекратится. Так же и в моем проекте, мне необходимо ЗАВЕРШАТЬ предыдущую функцию. Чтобы всегда работала лишь одна.
Ответы (2 шт):
Исправил, теперь джоб будет очищаться после ввода новых данных
import schedule
import time
from threading import Thread
def printing(num):
print(num)
def schedule_checker():
while True:
schedule.run_pending()
time.sleep(1)
# Создаем поток опроса schedule
sch = Thread(target=schedule_checker)
sch.start()
while True:
num = input("")
# Проверяем есть ли активные джобы и если есть удаляем их
if schedule.jobs:
schedule.clear()
# Создаем новый джоб
schedule.every(2).seconds.do(printing, num=num)
Тут нет ничего сложного, просто после выполнения функции нужно убивать джоб.
import schedule
import time
from threading import Thread
def printing(num):
print(num)
return schedule.CancelJob
def schedule_checker():
while True:
schedule.run_pending()
time.sleep(1)
while True:
num = input("")
schedule.every(2).seconds.do(printing, num=num)
sch = Thread(target=schedule_checker)
sch.start()
- поток проверки шедулера стартуйте заранее один раз, у вас сейчас получается каждый раз создаётся ещё один дополнительный поток проверки, это лишнее
- расписание можно, например, чистить полностью
- можно ещё печатать содержимое текущего расписания, чтобы убедиться, что там ровно один джоб:
sch = Thread(target=schedule_checker)
sch.start()
while True:
num = input("")
schedule.clear() # чистка всего расписания
schedule.every(2).seconds.do(lambda:printing(num))
print(schedule.jobs) # печать текущего расписания
А вообще в вашем примере можно даже не чистить расписание. Поскольку вы печатаете одну и ту же переменную, можно просто менять эту переменную, и всё. А расписание запустить один раз. И всё будет работать. Будет печататься самое последнее введённое в num значение:
sch = Thread(target=schedule_checker)
sch.start()
while True:
num = input("")
if not schedule.jobs:
schedule.every(2).seconds.do(lambda: printing(num))