Документация Python неофициальный перевод
Содержание страницы

8.8. 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

8.8.1. Объекты планировщикаScheduler Objects

Экземпляры scheduler имеют следующие методы и атрибуты:

scheduler.enterabs(time, priority, action, argument)

Планирует новое событие. Аргумент time должен быть числового типа, совместимого с возвращаемым значением функции 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.

Новое в версии 2.6.