Post content
В Python есть стандартный модуль sched для синхронного планировщика задач. Что??? Синхронных??? В наш-то век "асинхронщины" и "параллельщины"! Спокойно, сначала смотрим код, потом разбираемся. Работает это так: - создаём планировщик - добавляем задачи в очередь с таймаутом и приоритетом - запускаем и ждём пока завершится вся очередь Смотрим пример: 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