17db96d56Sopenharmony_ci:mod:`sched` --- Event scheduler
27db96d56Sopenharmony_ci================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: sched
57db96d56Sopenharmony_ci   :synopsis: General purpose event scheduler.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci**Source code:** :source:`Lib/sched.py`
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci.. index:: single: event scheduling
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci--------------
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciThe :mod:`sched` module defines a class which implements a general purpose event
167db96d56Sopenharmony_cischeduler:
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci.. class:: scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci   The :class:`scheduler` class defines a generic interface to scheduling events.
217db96d56Sopenharmony_ci   It needs two functions to actually deal with the "outside world" --- *timefunc*
227db96d56Sopenharmony_ci   should be callable without arguments, and return  a number (the "time", in any
237db96d56Sopenharmony_ci   units whatsoever).  The *delayfunc* function should be callable with one
247db96d56Sopenharmony_ci   argument, compatible with the output of *timefunc*, and should delay that many
257db96d56Sopenharmony_ci   time units. *delayfunc* will also be called with the argument ``0`` after each
267db96d56Sopenharmony_ci   event is run to allow other threads an opportunity to run in multi-threaded
277db96d56Sopenharmony_ci   applications.
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci   .. versionchanged:: 3.3
307db96d56Sopenharmony_ci      *timefunc* and *delayfunc* parameters are optional.
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci   .. versionchanged:: 3.3
337db96d56Sopenharmony_ci      :class:`scheduler` class can be safely used in multi-threaded
347db96d56Sopenharmony_ci      environments.
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciExample::
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci   >>> import sched, time
397db96d56Sopenharmony_ci   >>> s = sched.scheduler(time.monotonic, time.sleep)
407db96d56Sopenharmony_ci   >>> def print_time(a='default'):
417db96d56Sopenharmony_ci   ...     print("From print_time", time.time(), a)
427db96d56Sopenharmony_ci   ...
437db96d56Sopenharmony_ci   >>> def print_some_times():
447db96d56Sopenharmony_ci   ...     print(time.time())
457db96d56Sopenharmony_ci   ...     s.enter(10, 1, print_time)
467db96d56Sopenharmony_ci   ...     s.enter(5, 2, print_time, argument=('positional',))
477db96d56Sopenharmony_ci   ...     # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
487db96d56Sopenharmony_ci   ...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
497db96d56Sopenharmony_ci   ...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
507db96d56Sopenharmony_ci   ...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
517db96d56Sopenharmony_ci   ...     s.run()
527db96d56Sopenharmony_ci   ...     print(time.time())
537db96d56Sopenharmony_ci   ...
547db96d56Sopenharmony_ci   >>> print_some_times()
557db96d56Sopenharmony_ci   1652342830.3640375
567db96d56Sopenharmony_ci   From print_time 1652342830.3642538 second enterabs
577db96d56Sopenharmony_ci   From print_time 1652342830.3643398 first enterabs
587db96d56Sopenharmony_ci   From print_time 1652342835.3694863 positional
597db96d56Sopenharmony_ci   From print_time 1652342835.3696074 keyword
607db96d56Sopenharmony_ci   From print_time 1652342840.369612 default
617db96d56Sopenharmony_ci   1652342840.3697174
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci.. _scheduler-objects:
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ciScheduler Objects
677db96d56Sopenharmony_ci-----------------
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci:class:`scheduler` instances have the following methods and attributes:
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci.. method:: scheduler.enterabs(time, priority, action, argument=(), kwargs={})
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci   Schedule a new event. The *time* argument should be a numeric type compatible
757db96d56Sopenharmony_ci   with the return value of the *timefunc* function passed  to the constructor.
767db96d56Sopenharmony_ci   Events scheduled for the same *time* will be executed in the order of their
777db96d56Sopenharmony_ci   *priority*. A lower number represents a higher priority.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   Executing the event means executing ``action(*argument, **kwargs)``.
807db96d56Sopenharmony_ci   *argument* is a sequence holding the positional arguments for *action*.
817db96d56Sopenharmony_ci   *kwargs* is a dictionary holding the keyword arguments for *action*.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   Return value is an event which may be used for later cancellation of the event
847db96d56Sopenharmony_ci   (see :meth:`cancel`).
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci   .. versionchanged:: 3.3
877db96d56Sopenharmony_ci      *argument* parameter is optional.
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   .. versionchanged:: 3.3
907db96d56Sopenharmony_ci      *kwargs* parameter was added.
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci.. method:: scheduler.enter(delay, priority, action, argument=(), kwargs={})
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci   Schedule an event for *delay* more time units. Other than the relative time, the
967db96d56Sopenharmony_ci   other arguments, the effect and the return value are the same as those for
977db96d56Sopenharmony_ci   :meth:`enterabs`.
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci   .. versionchanged:: 3.3
1007db96d56Sopenharmony_ci      *argument* parameter is optional.
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci   .. versionchanged:: 3.3
1037db96d56Sopenharmony_ci      *kwargs* parameter was added.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci.. method:: scheduler.cancel(event)
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci   Remove the event from the queue. If *event* is not an event currently in the
1087db96d56Sopenharmony_ci   queue, this method will raise a :exc:`ValueError`.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci.. method:: scheduler.empty()
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   Return ``True`` if the event queue is empty.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci.. method:: scheduler.run(blocking=True)
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci   Run all scheduled events. This method will wait  (using the :func:`delayfunc`
1197db96d56Sopenharmony_ci   function passed to the constructor) for the next event, then execute it and so
1207db96d56Sopenharmony_ci   on until there are no more scheduled events.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   If *blocking* is false executes the scheduled events due to expire soonest
1237db96d56Sopenharmony_ci   (if any) and then return the deadline of the next scheduled call in the
1247db96d56Sopenharmony_ci   scheduler (if any).
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci   Either *action* or *delayfunc* can raise an exception.  In either case, the
1277db96d56Sopenharmony_ci   scheduler will maintain a consistent state and propagate the exception.  If an
1287db96d56Sopenharmony_ci   exception is raised by *action*, the event will not be attempted in future calls
1297db96d56Sopenharmony_ci   to :meth:`run`.
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci   If a sequence of events takes longer to run than the time available before the
1327db96d56Sopenharmony_ci   next event, the scheduler will simply fall behind.  No events will be dropped;
1337db96d56Sopenharmony_ci   the calling code is responsible for canceling  events which are no longer
1347db96d56Sopenharmony_ci   pertinent.
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   .. versionchanged:: 3.3
1377db96d56Sopenharmony_ci      *blocking* parameter was added.
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci.. attribute:: scheduler.queue
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci   Read-only attribute returning a list of upcoming events in the order they
1427db96d56Sopenharmony_ci   will be run.  Each event is shown as a :term:`named tuple` with the
1437db96d56Sopenharmony_ci   following fields:  time, priority, action, argument, kwargs.
144