Спокойно, сначала смотрим код, потом разбираемся.
Работает это так:
- создаём планировщик
- добавляем задачи в очередь с таймаутом и приоритетом
- запускаем и ждём пока завершится вся очередь
Смотрим пример:
import sched, time
def func(name):
t = round(time.time()-start_time, 2)
print(f"Execute {name} ({t}s)")
# просто отметка времени старта
start_time = time.time()
# создаём планировщик
s = sched.scheduler(
time.time, # функция замера времени
time.sleep # функция ожидания
)
# добавляем задачи
s.enter(0, 1, func, argument=('ev1',))
s.enter(2, 1, func, argument=('ev2',))
s.enter(1, 1, func, argument=('ev3',))
# запускаем очередь на исполнение
s.run()
Описание аргументовВывод получаем в соответствии со временем задержки:
Execute ev1 (0.0s)
Execute ev3 (1.0s)
Execute ev2 (2.0s)
Функция run() запускает планировщик и начинается выполнение задач в порядке очереди по времени и приоритету.Время указывается с момента старта очереди. Если время совпадает то сортировка идёт по приоритету.
Что значит синхронный планировщик? Это значит что задачи будут выполняться строго по очереди в одном потоке. Никаких мультипотоков и мультипроцессов, модуль прост как бревно!
Если у первой задачи стоит задержка 0сек а у второй 1сек, и при этом первая задача выполняется 3сек, то вторая задача выполнится только через 3 сек. Никакого параллельного запуска не будет.
Параметр delay следует понимать не как "запусти через N сек" а как "запусти не раньше чем через N сек". Время запуска следующей зависит от выполнения предыдущих задач.
Где это может пригодиться? Очередь задач, между которыми должен быть промежуток времени по какой-либо причине.
🔸 несколько синхронных задач, которые должны выполняться друг за другом но требующие ожидания обновления какой-либо инфраструктуры (тормозная сеть?)
🔸 сетевой API который имеет лимит на количество команд в единицу времени
🔸 фейковая задержка для генерации тестов или имитация поведения юзера.
Конечно, всё это можно решить банальным time.sleep() в нужном месте, но sched даёт несколько более удобный интерфейс управления задачами.
#libs