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

sched.md

99 строк · 7.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/sched.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7.7. [`sched`](https://python-all.ru/3.2/library/sched.html#module-sched) – Планировщик событий89**Исходный код:** [Lib/sched.py](https://python-all.ru/src/3.2/Lib/sched.py)1011---1213Модуль [`sched`](https://python-all.ru/3.2/library/sched.html#module-sched) определяет класс, реализующий планировщик событий общего назначения:1415#### `class sched.scheduler(timefunc, delayfunc)`1617Класс [`scheduler`](https://python-all.ru/3.2/library/sched.html#sched.scheduler) определяет универсальный интерфейс для планирования событий. Для взаимодействия с «внешним миром» необходимы две функции: *timefunc* должна вызываться без аргументов и возвращать число («время» в любых единицах). Функция *delayfunc* должна вызываться с одним аргументом, совместимым с результатом *timefunc*, и задерживать выполнение на указанное количество единиц времени. *delayfunc* также будет вызываться с аргументом `0` после выполнения каждого события, чтобы дать другим потокам возможность выполняться в многопоточных приложениях.1819Пример:2021```python22>>> import sched, time23>>> s = sched.scheduler(time.time, time.sleep)24>>> def print_time(): print("From print_time", time.time())25...26>>> def print_some_times():27...     print(time.time())28...     s.enter(5, 1, print_time, ())29...     s.enter(10, 1, print_time, ())30...     s.run()31...     print(time.time())32...33>>> print_some_times()34930343690.25735From print_time 930343695.27436From print_time 930343700.27337930343700.27638```3940В многопоточных средах класс [`scheduler`](https://python-all.ru/3.2/library/sched.html#sched.scheduler) имеет ограничения с точки зрения потокобезопасности: невозможность вставить новую задачу перед той, что ожидает выполнения в работающем планировщике, и блокировка основного потока до тех пор, пока очередь событий не опустеет. Вместо этого предпочтительнее использовать класс [`threading.Timer`](https://python-all.ru/3.2/library/threading.html#threading.Timer).4142Пример:4344```python45>>> import time46>>> from threading import Timer47>>> def print_time():48...     print("From print_time", time.time())49...50>>> def print_some_times():51...     print(time.time())52...     Timer(5, print_time, ()).start()53...     Timer(10, print_time, ()).start()54...     time.sleep(11)  # ожидание, пока выполняются события с задержкой по времени55...     print(time.time())56...57>>> print_some_times()58930343690.25759From print_time 930343695.27460From print_time 930343700.27361930343701.30162```6364## 7.7.1. Объекты планировщика6566Экземпляры [`scheduler`](https://python-all.ru/3.2/library/sched.html#sched.scheduler) имеют следующие методы и атрибуты:6768#### `scheduler.enterabs(time, priority, action, argument)`6970Планирует новое событие. Аргумент *время* должен быть числового типа, совместимого с возвращаемым значением функции *timefunc*, переданной конструктору. События, запланированные на одно и то же *время*, будут выполнены в порядке их *приоритета*.7172Выполнение события означает выполнение `action(*argument)`. *argument* должен быть последовательностью, содержащей параметры для *action*.7374Возвращаемое значение – это событие, которое можно использовать для последующей отмены этого события (см. [`cancel()`](https://python-all.ru/3.2/library/sched.html#sched.scheduler.cancel)).7576#### `scheduler.enter(delay, priority, action, argument)`7778Планирует событие через *delay* единиц времени. За исключением относительного времени, остальные аргументы, результат и возвращаемое значение такие же, как у [`enterabs()`](https://python-all.ru/3.2/library/sched.html#sched.scheduler.enterabs).7980#### `scheduler.cancel(event)`8182Удаляет событие из очереди. Если *event* не является событием, находящимся в настоящее время в очереди, этот метод возбудит исключение [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError).8384#### `scheduler.empty()`8586Возвращает true, если очередь событий пуста.8788#### `scheduler.run()`8990Запускает все запланированные события. Эта функция будет ожидать (с помощью функции `delayfunc()` , переданной конструктору) следующего события, затем выполнит его и так далее, пока не останется запланированных событий.9192Как *action*, так и *delayfunc* могут возбуждать исключение. В любом случае планировщик сохранит согласованное состояние и пробросит исключение. Если исключение возбуждено *action*, это событие не будет повторно предпринято при последующих вызовах [`run()`](https://python-all.ru/3.2/library/sched.html#sched.scheduler.run).9394Если выполнение последовательности событий занимает больше времени, чем доступно до следующего события, планировщик просто отстанет от графика. Ни одно событие не будет отброшено; вызывающий код отвечает за отмену событий, которые больше не актуальны.9596#### `scheduler.queue`9798Атрибут только для чтения, возвращающий список предстоящих событий в порядке их выполнения. Каждое событие представлено как [*именованный кортеж*](https://python-all.ru/3.2/glossary.html#term-named-tuple) со следующими полями: time, priority, action, argument.99