Issue #6644: Fix compile error on AIX.
[python.git] / Doc / library / sched.rst
blob51b9d3fb660de1df366e8943d67eaa671fb32a49
1 :mod:`sched` --- Event scheduler
2 ================================
4 .. module:: sched
5    :synopsis: General purpose event scheduler.
6 .. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
8 .. index:: single: event scheduling
10 The :mod:`sched` module defines a class which implements a general purpose event
11 scheduler:
14 .. class:: scheduler(timefunc, delayfunc)
16    The :class:`scheduler` class defines a generic interface to scheduling events.
17    It needs two functions to actually deal with the "outside world" --- *timefunc*
18    should be callable without arguments, and return  a number (the "time", in any
19    units whatsoever).  The *delayfunc* function should be callable with one
20    argument, compatible with the output of *timefunc*, and should delay that many
21    time units. *delayfunc* will also be called with the argument ``0`` after each
22    event is run to allow other threads an opportunity to run in multi-threaded
23    applications.
25 Example::
27    >>> import sched, time
28    >>> s = sched.scheduler(time.time, time.sleep)
29    >>> def print_time(): print "From print_time", time.time()
30    ...
31    >>> def print_some_times():
32    ...     print time.time()
33    ...     s.enter(5, 1, print_time, ())
34    ...     s.enter(10, 1, print_time, ())
35    ...     s.run()
36    ...     print time.time()
37    ...
38    >>> print_some_times()
39    930343690.257
40    From print_time 930343695.274
41    From print_time 930343700.273
42    930343700.276
44 In multi-threaded environments, the :class:`scheduler` class has limitations
45 with respect to thread-safety, inability to insert a new task before
46 the one currently pending in a running scheduler, and holding up the main
47 thread until the event queue is empty.  Instead, the preferred approach
48 is to use the :class:`threading.Timer` class instead.
50 Example::
52     >>> import time
53     >>> from threading import Timer
54     >>> def print_time():
55     ...     print "From print_time", time.time()
56     ...
57     >>> def print_some_times():
58     ...     print time.time()
59     ...     Timer(5, print_time, ()).start()
60     ...     Timer(10, print_time, ()).start()
61     ...     time.sleep(11)  # sleep while time-delay events execute
62     ...     print time.time()
63     ...
64     >>> print_some_times()
65     930343690.257
66     From print_time 930343695.274
67     From print_time 930343700.273
68     930343701.301
71 .. _scheduler-objects:
73 Scheduler Objects
74 -----------------
76 :class:`scheduler` instances have the following methods and attributes:
79 .. method:: scheduler.enterabs(time, priority, action, argument)
81    Schedule a new event. The *time* argument should be a numeric type compatible
82    with the return value of the *timefunc* function passed  to the constructor.
83    Events scheduled for the same *time* will be executed in the order of their
84    *priority*.
86    Executing the event means executing ``action(*argument)``.  *argument* must be a
87    sequence holding the parameters for *action*.
89    Return value is an event which may be used for later cancellation of the event
90    (see :meth:`cancel`).
93 .. method:: scheduler.enter(delay, priority, action, argument)
95    Schedule an event for *delay* more time units. Other then the relative time, the
96    other arguments, the effect and the return value are the same as those for
97    :meth:`enterabs`.
100 .. method:: scheduler.cancel(event)
102    Remove the event from the queue. If *event* is not an event currently in the
103    queue, this method will raise a :exc:`ValueError`.
106 .. method:: scheduler.empty()
108    Return true if the event queue is empty.
111 .. method:: scheduler.run()
113    Run all scheduled events. This function will wait  (using the :func:`delayfunc`
114    function passed to the constructor) for the next event, then execute it and so
115    on until there are no more scheduled events.
117    Either *action* or *delayfunc* can raise an exception.  In either case, the
118    scheduler will maintain a consistent state and propagate the exception.  If an
119    exception is raised by *action*, the event will not be attempted in future calls
120    to :meth:`run`.
122    If a sequence of events takes longer to run than the time available before the
123    next event, the scheduler will simply fall behind.  No events will be dropped;
124    the calling code is responsible for canceling  events which are no longer
125    pertinent.
127 .. attribute:: scheduler.queue
129    Read-only attribute returning a list of upcoming events in the order they
130    will be run.  Each event is shown as a :term:`named tuple` with the
131    following fields:  time, priority, action, argument.
133    .. versionadded:: 2.6