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
, которые предоставляют более широкие возможности планирования.