blob: ad96dbc95b0cd2f084727e006988e6421941a400 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`sched` --- Event scheduler
2================================
3
4.. module:: sched
5 :synopsis: General purpose event scheduler.
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04006
Georg Brandl116aa622007-08-15 14:28:22 +00007.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
8
Raymond Hettinger10480942011-01-10 03:26:08 +00009**Source code:** :source:`Lib/sched.py`
10
Terry Jan Reedyfa089b92016-06-11 15:02:54 -040011.. index:: single: event scheduling
12
Raymond Hettinger4f707fd2011-01-10 19:54:11 +000013--------------
14
Georg Brandl116aa622007-08-15 14:28:22 +000015The :mod:`sched` module defines a class which implements a general purpose event
16scheduler:
17
Terry Jan Reedyadecf3f2013-03-09 02:14:27 -050018.. class:: scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
Georg Brandl116aa622007-08-15 14:28:22 +000019
20 The :class:`scheduler` class defines a generic interface to scheduling events.
21 It needs two functions to actually deal with the "outside world" --- *timefunc*
22 should be callable without arguments, and return a number (the "time", in any
Terry Jan Reedyadecf3f2013-03-09 02:14:27 -050023 units whatsoever). If time.monotonic is not available, the *timefunc* default
24 is time.time instead. The *delayfunc* function should be callable with one
Georg Brandl116aa622007-08-15 14:28:22 +000025 argument, compatible with the output of *timefunc*, and should delay that many
26 time units. *delayfunc* will also be called with the argument ``0`` after each
27 event is run to allow other threads an opportunity to run in multi-threaded
28 applications.
29
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010030 .. versionchanged:: 3.3
31 *timefunc* and *delayfunc* parameters are optional.
Serhiy Storchakae9124962012-12-29 20:57:52 +020032
Giampaolo Rodola'73520d52011-12-14 13:34:26 +010033 .. versionchanged:: 3.3
34 :class:`scheduler` class can be safely used in multi-threaded
35 environments.
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010036
Georg Brandl116aa622007-08-15 14:28:22 +000037Example::
38
39 >>> import sched, time
Christian Heimesfe337bf2008-03-23 21:54:12 +000040 >>> s = sched.scheduler(time.time, time.sleep)
Serhiy Storchakac04957b2012-12-29 21:13:45 +020041 >>> def print_time(a='default'):
42 ... print("From print_time", time.time(), a)
Georg Brandl116aa622007-08-15 14:28:22 +000043 ...
44 >>> def print_some_times():
Georg Brandl6911e3c2007-09-04 07:15:32 +000045 ... print(time.time())
Serhiy Storchakac04957b2012-12-29 21:13:45 +020046 ... s.enter(10, 1, print_time)
47 ... s.enter(5, 2, print_time, argument=('positional',))
48 ... s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
Georg Brandl116aa622007-08-15 14:28:22 +000049 ... s.run()
Georg Brandl6911e3c2007-09-04 07:15:32 +000050 ... print(time.time())
Georg Brandl116aa622007-08-15 14:28:22 +000051 ...
52 >>> print_some_times()
53 930343690.257
Serhiy Storchakac04957b2012-12-29 21:13:45 +020054 From print_time 930343695.274 positional
55 From print_time 930343695.275 keyword
56 From print_time 930343700.273 default
Georg Brandl116aa622007-08-15 14:28:22 +000057 930343700.276
58
Georg Brandl116aa622007-08-15 14:28:22 +000059.. _scheduler-objects:
60
61Scheduler Objects
62-----------------
63
Christian Heimes679db4a2008-01-18 09:56:22 +000064:class:`scheduler` instances have the following methods and attributes:
Georg Brandl116aa622007-08-15 14:28:22 +000065
66
Serhiy Storchakac04957b2012-12-29 21:13:45 +020067.. method:: scheduler.enterabs(time, priority, action, argument=(), kwargs={})
Georg Brandl116aa622007-08-15 14:28:22 +000068
69 Schedule a new event. The *time* argument should be a numeric type compatible
70 with the return value of the *timefunc* function passed to the constructor.
71 Events scheduled for the same *time* will be executed in the order of their
Mariatta9d5ec802017-11-24 21:43:01 -080072 *priority*. A lower number represents a higher priority.
Georg Brandl116aa622007-08-15 14:28:22 +000073
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010074 Executing the event means executing ``action(*argument, **kwargs)``.
Serhiy Storchaka75b936e2013-01-02 12:31:26 +020075 *argument* is a sequence holding the positional arguments for *action*.
76 *kwargs* is a dictionary holding the keyword arguments for *action*.
Georg Brandl116aa622007-08-15 14:28:22 +000077
78 Return value is an event which may be used for later cancellation of the event
79 (see :meth:`cancel`).
80
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010081 .. versionchanged:: 3.3
82 *argument* parameter is optional.
Georg Brandl116aa622007-08-15 14:28:22 +000083
Sergey Fedoseevf1202882018-07-06 05:01:16 +050084 .. versionchanged:: 3.3
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010085 *kwargs* parameter was added.
86
87
Serhiy Storchakac04957b2012-12-29 21:13:45 +020088.. method:: scheduler.enter(delay, priority, action, argument=(), kwargs={})
Georg Brandl116aa622007-08-15 14:28:22 +000089
Ezio Melottid3cf0db2011-10-28 12:22:25 +030090 Schedule an event for *delay* more time units. Other than the relative time, the
Georg Brandl116aa622007-08-15 14:28:22 +000091 other arguments, the effect and the return value are the same as those for
92 :meth:`enterabs`.
93
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010094 .. versionchanged:: 3.3
95 *argument* parameter is optional.
96
Sergey Fedoseevf1202882018-07-06 05:01:16 +050097 .. versionchanged:: 3.3
Giampaolo Rodola'be55d992011-11-22 13:33:34 +010098 *kwargs* parameter was added.
Georg Brandl116aa622007-08-15 14:28:22 +000099
100.. method:: scheduler.cancel(event)
101
102 Remove the event from the queue. If *event* is not an event currently in the
Georg Brandlc38a0002009-05-26 07:51:03 +0000103 queue, this method will raise a :exc:`ValueError`.
Georg Brandl116aa622007-08-15 14:28:22 +0000104
105
106.. method:: scheduler.empty()
107
108 Return true if the event queue is empty.
109
110
Giampaolo Rodola'556ba042011-12-14 14:38:45 +0100111.. method:: scheduler.run(blocking=True)
Georg Brandl116aa622007-08-15 14:28:22 +0000112
Giampaolo Rodola'556ba042011-12-14 14:38:45 +0100113 Run all scheduled events. This method will wait (using the :func:`delayfunc`
Georg Brandl116aa622007-08-15 14:28:22 +0000114 function passed to the constructor) for the next event, then execute it and so
115 on until there are no more scheduled events.
116
Serhiy Storchakafbc1c262013-11-29 12:17:13 +0200117 If *blocking* is false executes the scheduled events due to expire soonest
Giampaolo Rodola'a4e01882012-03-15 13:05:41 +0100118 (if any) and then return the deadline of the next scheduled call in the
119 scheduler (if any).
Giampaolo Rodola'556ba042011-12-14 14:38:45 +0100120
Georg Brandl116aa622007-08-15 14:28:22 +0000121 Either *action* or *delayfunc* can raise an exception. In either case, the
122 scheduler will maintain a consistent state and propagate the exception. If an
123 exception is raised by *action*, the event will not be attempted in future calls
124 to :meth:`run`.
125
126 If a sequence of events takes longer to run than the time available before the
127 next event, the scheduler will simply fall behind. No events will be dropped;
128 the calling code is responsible for canceling events which are no longer
129 pertinent.
130
Sergey Fedoseevf1202882018-07-06 05:01:16 +0500131 .. versionchanged:: 3.3
Giampaolo Rodola'556ba042011-12-14 14:38:45 +0100132 *blocking* parameter was added.
133
Christian Heimes679db4a2008-01-18 09:56:22 +0000134.. attribute:: scheduler.queue
135
136 Read-only attribute returning a list of upcoming events in the order they
137 will be run. Each event is shown as a :term:`named tuple` with the
Serhiy Storchakae9124962012-12-29 20:57:52 +0200138 following fields: time, priority, action, argument, kwargs.