sched.md
1> **Источник:** https://python-all.ru/3.1/library/sched.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.7. `sched` – Планировщик событий89Модуль `sched` определяет класс, реализующий универсальный планировщик событий:1011#### `class sched.scheduler(timefunc, delayfunc)`1213Класс1415[`scheduler`](https://python-all.ru/3.1/library/sched.html#sched.scheduler)1617определяет универсальный интерфейс для планирования событий. Для взаимодействия с «внешним миром» необходимы две функции:1819*timefunc*2021должна вызываться без аргументов и возвращать число («время» в любых единицах). Функция2223*delayfunc*2425должна вызываться с одним аргументом, совместимым с результатом2627*timefunc*2829, и задерживать выполнение на указанное количество единиц времени.3031*delayfunc*3233также будет вызываться с аргументом3435`0`3637после выполнения каждого события, чтобы дать другим потокам возможность выполняться в многопоточных приложениях.3839Пример:4041```python42>>> import sched, time43>>> s = sched.scheduler(time.time, time.sleep)44>>> def print_time(): print("From print_time", time.time())45...46>>> def print_some_times():47... print(time.time())48... s.enter(5, 1, print_time, ())49... s.enter(10, 1, print_time, ())50... s.run()51... print(time.time())52...53>>> print_some_times()54930343690.25755From print_time 930343695.27456From print_time 930343700.27357930343700.27658```5960В многопоточных средах класс [`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).6162Пример:6364```python65>>> import time66>>> from threading import Timer67>>> def print_time():68... print("From print_time", time.time())69...70>>> def print_some_times():71... print(time.time())72... Timer(5, print_time, ()).start()73... Timer(10, print_time, ()).start()74... time.sleep(11) # ожидание, пока выполняются события с задержкой по времени75... print(time.time())76...77>>> print_some_times()78930343690.25779From print_time 930343695.27480From print_time 930343700.27381930343701.30182```8384## 8.7.1. Объекты планировщика8586Экземпляры [`scheduler`](https://python-all.ru/3.1/library/sched.html#sched.scheduler) имеют следующие методы и атрибуты:8788#### `scheduler.enterabs(time, priority, action, argument)`8990Планирует новое событие. Аргумент *время* должен быть числового типа, совместимого с возвращаемым значением функции *timefunc*, переданной конструктору. События, запланированные на одно и то же *время*, будут выполнены в порядке их *приоритета*.9192Выполнение события означает выполнение `action(*argument)`. *argument* должен быть последовательностью, содержащей параметры для *action*.9394Возвращаемое значение – это событие, которое можно использовать для последующей отмены этого события (см. [`cancel()`](https://python-all.ru/3.1/library/sched.html#sched.scheduler.cancel)).9596#### `scheduler.enter(delay, priority, action, argument)`9798Планирует событие через99100*delay*101102единиц времени. За исключением относительного времени, остальные аргументы, эффект и возвращаемое значение те же, что и у103104[`enterabs()`](https://python-all.ru/3.1/library/sched.html#sched.scheduler.enterabs)105106.107108#### `scheduler.cancel(event)`109110Удаляет событие из очереди. Если111112*event*113114не является событием, находящимся в настоящее время в очереди, этот метод возбудит исключение115116[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)117118.119120#### `scheduler.empty()`121122Возвращает true, если очередь событий пуста.123124#### `scheduler.run()`125126Запускает все запланированные события. Эта функция будет ожидать (с помощью функции `delayfunc()` , переданной конструктору) следующего события, затем выполнит его и так далее, пока не останется запланированных событий.127128Как *action*, так и *delayfunc* могут возбуждать исключение. В любом случае планировщик сохранит согласованное состояние и пробросит исключение. Если исключение возбуждено *action*, это событие не будет повторно предпринято при последующих вызовах [`run()`](https://python-all.ru/3.1/library/sched.html#sched.scheduler.run).129130Если выполнение последовательности событий занимает больше времени, чем доступно до следующего события, планировщик просто отстанет от графика. Ни одно событие не будет отброшено; вызывающий код отвечает за отмену событий, которые больше не актуальны.131132#### `scheduler.queue`133134Атрибут только для чтения, возвращающий список предстоящих событий в порядке их выполнения. Каждое событие представлено как135136[*именованный кортеж*](https://python-all.ru/3.1/glossary.html#term-named-tuple)137138со следующими полями: time, priority, action, argument.139