threading.Timer(interval, function, args=[], kwargs={}) для периодического выполнения задач. interval - это интервал в секундах между вызовами function.  function должна в конце своего выполнения создавать и запускать новый Timer. 
import threading
def my_task():
  print("Задача выполняется")
  threading.Timer(5, my_task).start() # Запускаем таймер снова
timer = threading.Timer(5, my_task)
timer.start()
  threading.Timer(), необходимо создать экземпляр Timer, указав интервал в секундах и функцию, которую нужно периодически вызывать. Важно помнить, что Timer выполняет функцию в отдельном потоке.  Чтобы обеспечить периодичность, функция, вызываемая таймером, должна перезапускать таймер в конце своего выполнения.
  Пример:
import threading
import time
def my_task():
  """Функция, выполняемая периодически."""
  print(f"Задача выполняется: {time.strftime('%Y-%m-%d %H:%M:%S')}")
  # Перезапуск таймера
  global timer  # Важно, чтобы таймер был виден из функции
  timer = threading.Timer(5, my_task) # Пересоздаем таймер с нужным интервалом
  timer.start()
# Создание и запуск таймера (первый запуск)
timer = threading.Timer(5, my_task)
timer.start()
# Пример: Остановка таймера через некоторое время
time.sleep(15) # Дадим таймеру поработать немного
print("Остановка таймера...")
timer.cancel() # Останавливаем таймер
print("Таймер остановлен.")
# (Закомментировано, чтобы пример выполнялся без ожидания)
# input("Нажмите Enter, чтобы выйти...")
  Разъяснения:
import threading: Импортирует модуль threading для работы с потоками.import time: Импортирует модуль time для работы со временем (в примере используется для вывода текущего времени).my_task(): Это функция, которая будет выполняться периодически. Внутри неё мы выводим текущее время и, самое главное, создаем новый экземпляр threading.Timer, который запланирован к выполнению через заданный интервал (в примере 5 секунд). Этот новый таймер запускается с помощью timer.start(). Таким образом, функция перезапускает себя. Важно использовать global timer, чтобы таймер был доступен изнутри функции и можно было создать новый экземпляр.timer = threading.Timer(5, my_task): Создает экземпляр Timer.  Первый аргумент - интервал в секундах (5 секунд), второй аргумент - функция, которую нужно вызвать (my_task).timer.start(): Запускает таймер.timer.cancel(): Останавливает таймер.  Важно вызвать timer.cancel(), когда задача больше не требуется, чтобы остановить выполнение потока и избежать утечек ресурсов.time.sleep(15): В примере используется time.sleep для того, чтобы главный поток подождал 15 секунд, пока таймер выполняет свою задачу.Важные моменты:
threading.Timer после указания функции. Например: threading.Timer(5, my_task, args=(arg1, arg2)).timer.cancel()), чтобы избежать бесконечного выполнения задачи.Timer создает отдельный поток. Убедитесь, что ваш код потокобезопасен, особенно если он работает с общими ресурсами. Используйте блокировки (threading.Lock) при необходимости.sched или сторонних библиотек, таких как schedule или APScheduler, которые предоставляют более широкие возможности планирования.