blob: e9619fb984cdc99874324a2986e6b60cb2c2097e [file] [log] [blame]
Georg Brandl8ec7f652007-08-15 14:28:01 +00001:mod:`sched` --- Event scheduler
2================================
3
4.. module:: sched
5 :synopsis: General purpose event scheduler.
6.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
7
Georg Brandl8ec7f652007-08-15 14:28:01 +00008.. index:: single: event scheduling
9
10The :mod:`sched` module defines a class which implements a general purpose event
11scheduler:
12
13
14.. class:: scheduler(timefunc, delayfunc)
15
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.
24
25Example::
26
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
43
Raymond Hettingerd0ab0142008-01-17 22:27:49 +000044In multi-threaded environments, the :class:`scheduler` class has limitations
45with respect to thread-safety, inability to insert a new task before
46the one currently pending in a running scheduler, and holding-up the main
47thread until the event queue is empty. Instead, the preferred approach
48is to use the :class:`threading.Timer` class instead.
49
50Example::
51
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, 1, print_time, ())
61 ... print time.time() # executes before the time-delay events
62 ...
63 >>> print_some_times()
64 930343690.257
65 930343690.301
66 From print_time 930343695.274
67 From print_time 930343700.273
68
Georg Brandl8ec7f652007-08-15 14:28:01 +000069
70.. _scheduler-objects:
71
72Scheduler Objects
73-----------------
74
Raymond Hettinger44bd6c02008-01-17 19:31:38 +000075:class:`scheduler` instances have the following methods and attributes:
Georg Brandl8ec7f652007-08-15 14:28:01 +000076
77
78.. method:: scheduler.enterabs(time, priority, action, argument)
79
80 Schedule a new event. The *time* argument should be a numeric type compatible
81 with the return value of the *timefunc* function passed to the constructor.
82 Events scheduled for the same *time* will be executed in the order of their
83 *priority*.
84
85 Executing the event means executing ``action(*argument)``. *argument* must be a
86 sequence holding the parameters for *action*.
87
88 Return value is an event which may be used for later cancellation of the event
89 (see :meth:`cancel`).
90
91
92.. method:: scheduler.enter(delay, priority, action, argument)
93
94 Schedule an event for *delay* more time units. Other then the relative time, the
95 other arguments, the effect and the return value are the same as those for
96 :meth:`enterabs`.
97
98
99.. method:: scheduler.cancel(event)
100
101 Remove the event from the queue. If *event* is not an event currently in the
102 queue, this method will raise a :exc:`RuntimeError`.
103
104
105.. method:: scheduler.empty()
106
107 Return true if the event queue is empty.
108
109
110.. method:: scheduler.run()
111
112 Run all scheduled events. This function will wait (using the :func:`delayfunc`
113 function passed to the constructor) for the next event, then execute it and so
114 on until there are no more scheduled events.
115
116 Either *action* or *delayfunc* can raise an exception. In either case, the
117 scheduler will maintain a consistent state and propagate the exception. If an
118 exception is raised by *action*, the event will not be attempted in future calls
119 to :meth:`run`.
120
121 If a sequence of events takes longer to run than the time available before the
122 next event, the scheduler will simply fall behind. No events will be dropped;
123 the calling code is responsible for canceling events which are no longer
124 pertinent.
125
Raymond Hettinger44bd6c02008-01-17 19:31:38 +0000126.. attribute:: scheduler.queue
127
128 Read-only attribute returning a list of upcoming events in the order they
129 will be run. Each event is shown as a :term:`named tuple` with the
130 following fields: time, priority, action, argument.