> **Источник:** https://python-all.ru/3.1/library/sched.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 8.7. `sched` – Планировщик событий

Модуль `sched` определяет класс, реализующий универсальный планировщик событий:

#### `class sched.scheduler(timefunc, delayfunc)`

Класс

[`scheduler`](https://python-all.ru/3.1/library/sched.html#sched.scheduler)

определяет универсальный интерфейс для планирования событий. Для взаимодействия с «внешним миром» необходимы две функции:

*timefunc*

должна вызываться без аргументов и возвращать число («время» в любых единицах). Функция

*delayfunc*

должна вызываться с одним аргументом, совместимым с результатом

*timefunc*

, и задерживать выполнение на указанное количество единиц времени.

*delayfunc*

также будет вызываться с аргументом

`0`

после выполнения каждого события, чтобы дать другим потокам возможность выполняться в многопоточных приложениях.

Пример:

```python
>>> 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`](https://python-all.ru/3.1/library/sched.html#sched.scheduler) имеет ограничения с точки зрения потокобезопасности: невозможность вставить новую задачу перед той, что ожидает выполнения в работающем планировщике, и блокировка основного потока до тех пор, пока очередь событий не опустеет. Вместо этого предпочтительнее использовать класс [`threading.Timer`](https://python-all.ru/3.1/library/threading.html#threading.Timer).

Пример:

```python
>>> 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.7.1. Объекты планировщика

Экземпляры [`scheduler`](https://python-all.ru/3.1/library/sched.html#sched.scheduler) имеют следующие методы и атрибуты:

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

Планирует новое событие. Аргумент *время* должен быть числового типа, совместимого с возвращаемым значением функции *timefunc*, переданной конструктору. События, запланированные на одно и то же *время*, будут выполнены в порядке их *приоритета*.

Выполнение события означает выполнение `action(*argument)`. *argument* должен быть последовательностью, содержащей параметры для *action*.

Возвращаемое значение – это событие, которое можно использовать для последующей отмены этого события (см. [`cancel()`](https://python-all.ru/3.1/library/sched.html#sched.scheduler.cancel)).

#### `scheduler.enter(delay, priority, action, argument)`

Планирует событие через

*delay*

единиц времени. За исключением относительного времени, остальные аргументы, эффект и возвращаемое значение те же, что и у

[`enterabs()`](https://python-all.ru/3.1/library/sched.html#sched.scheduler.enterabs)

.

#### `scheduler.cancel(event)`

Удаляет событие из очереди. Если

*event*

не является событием, находящимся в настоящее время в очереди, этот метод возбудит исключение

[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)

.

#### `scheduler.empty()`

Возвращает true, если очередь событий пуста.

#### `scheduler.run()`

Запускает все запланированные события. Эта функция будет ожидать (с помощью функции `delayfunc()` , переданной конструктору) следующего события, затем выполнит его и так далее, пока не останется запланированных событий.

Как *action*, так и *delayfunc* могут возбуждать исключение. В любом случае планировщик сохранит согласованное состояние и пробросит исключение. Если исключение возбуждено *action*, это событие не будет повторно предпринято при последующих вызовах [`run()`](https://python-all.ru/3.1/library/sched.html#sched.scheduler.run).

Если выполнение последовательности событий занимает больше времени, чем доступно до следующего события, планировщик просто отстанет от графика. Ни одно событие не будет отброшено; вызывающий код отвечает за отмену событий, которые больше не актуальны.

#### `scheduler.queue`

Атрибут только для чтения, возвращающий список предстоящих событий в порядке их выполнения. Каждое событие представлено как

[*именованный кортеж*](https://python-all.ru/3.1/glossary.html#term-named-tuple)

со следующими полями: time, priority, action, argument.
