Содержание страницы
7.7. sched – Планировщик событий¶sched – Event scheduler
Исходный код: Lib/sched.py
Модуль sched определяет класс, реализующий планировщик событий общего назначения:
- class sched.scheduler(timefunc, delayfunc)¶
Класс scheduler определяет универсальный интерфейс для планирования событий. Для взаимодействия с «внешним миром» необходимы две функции: timefunc должна вызываться без аргументов и возвращать число («время» в любых единицах). Функция delayfunc должна вызываться с одним аргументом, совместимым с результатом timefunc, и задерживать выполнение на указанное количество единиц времени. delayfunc также будет вызываться с аргументом 0 после выполнения каждого события, чтобы дать другим потокам возможность выполняться в многопоточных приложениях.
Пример:
>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(): print("From print_time", time.time())
...
>>> def print_some_times():
... print(time.time())
... s.enter(5, 1, print_time, ())
... s.enter(10, 1, print_time, ())
... s.run()
... print(time.time())
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343700.276
В многопоточных средах класс scheduler имеет ограничения с точки зрения потокобезопасности: невозможность вставить новую задачу перед той, что ожидает выполнения в работающем планировщике, и блокировка основного потока до тех пор, пока очередь событий не опустеет. Вместо этого предпочтительнее использовать класс threading.Timer.
Пример:
>>> import time
>>> from threading import Timer
>>> def print_time():
... print("From print_time", time.time())
...
>>> def print_some_times():
... print(time.time())
... Timer(5, print_time, ()).start()
... Timer(10, print_time, ()).start()
... time.sleep(11) # ожидание, пока выполняются события с задержкой по времени
... print(time.time())
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343701.301
7.7.1. Объекты планировщика¶Scheduler Objects
Экземпляры scheduler имеют следующие методы и атрибуты:
- scheduler.enterabs(time, priority, action, argument)¶
Планирует новое событие. Аргумент время должен быть числового типа, совместимого с возвращаемым значением функции timefunc, переданной конструктору. События, запланированные на одно и то же время, будут выполнены в порядке их приоритета.
Выполнение события означает выполнение action(*argument). argument должен быть последовательностью, содержащей параметры для action.
Возвращаемое значение – это событие, которое можно использовать для последующей отмены этого события (см. cancel()).
- scheduler.enter(delay, priority, action, argument)¶
Планирует событие через delay единиц времени. За исключением относительного времени, остальные аргументы, результат и возвращаемое значение такие же, как у enterabs().
- scheduler.cancel(event)¶
Удаляет событие из очереди. Если event не является событием, находящимся в настоящее время в очереди, этот метод возбудит исключение ValueError.
- scheduler.empty()¶
Возвращает true, если очередь событий пуста.
- scheduler.run()¶
Запускает все запланированные события. Эта функция будет ожидать (с помощью функции delayfunc() , переданной конструктору) следующего события, затем выполнит его и так далее, пока не останется запланированных событий.
Как action, так и delayfunc могут возбуждать исключение. В любом случае планировщик сохранит согласованное состояние и пробросит исключение. Если исключение возбуждено action, это событие не будет повторно предпринято при последующих вызовах run().
Если выполнение последовательности событий занимает больше времени, чем доступно до следующего события, планировщик просто отстанет от графика. Ни одно событие не будет отброшено; вызывающий код отвечает за отмену событий, которые больше не актуальны.
- scheduler.queue¶
Атрибут только для чтения, возвращающий список предстоящих событий в порядке их выполнения. Каждое событие представлено как именованный кортеж со следующими полями: time, priority, action, argument.