Как завершить предыдущую функцию из 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 шт):

Автор решения: Edward Grachev

Исправил, теперь джоб будет очищаться после ввода новых данных

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()
→ Ссылка
Автор решения: CrazyElf
  • поток проверки шедулера стартуйте заранее один раз, у вас сейчас получается каждый раз создаётся ещё один дополнительный поток проверки, это лишнее
  • расписание можно, например, чистить полностью
  • можно ещё печатать содержимое текущего расписания, чтобы убедиться, что там ровно один джоб:
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))
→ Ссылка