2007-08-15 11:28:22 -03:00
|
|
|
:mod:`sched` --- Event scheduler
|
|
|
|
================================
|
|
|
|
|
|
|
|
.. module:: sched
|
|
|
|
:synopsis: General purpose event scheduler.
|
|
|
|
|
2016-06-11 16:02:54 -03:00
|
|
|
.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
|
2007-08-15 11:28:22 -03:00
|
|
|
|
2011-01-09 23:26:08 -04:00
|
|
|
**Source code:** :source:`Lib/sched.py`
|
|
|
|
|
2016-06-11 16:02:54 -03:00
|
|
|
.. index:: single: event scheduling
|
|
|
|
|
2011-01-10 15:54:11 -04:00
|
|
|
--------------
|
|
|
|
|
2007-08-15 11:28:22 -03:00
|
|
|
The :mod:`sched` module defines a class which implements a general purpose event
|
|
|
|
scheduler:
|
|
|
|
|
2013-03-09 03:14:27 -04:00
|
|
|
.. class:: scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
The :class:`scheduler` class defines a generic interface to scheduling events.
|
|
|
|
It needs two functions to actually deal with the "outside world" --- *timefunc*
|
|
|
|
should be callable without arguments, and return a number (the "time", in any
|
2019-05-28 07:47:24 -03:00
|
|
|
units whatsoever). The *delayfunc* function should be callable with one
|
2007-08-15 11:28:22 -03:00
|
|
|
argument, compatible with the output of *timefunc*, and should delay that many
|
|
|
|
time units. *delayfunc* will also be called with the argument ``0`` after each
|
|
|
|
event is run to allow other threads an opportunity to run in multi-threaded
|
|
|
|
applications.
|
|
|
|
|
2011-11-22 08:33:34 -04:00
|
|
|
.. versionchanged:: 3.3
|
|
|
|
*timefunc* and *delayfunc* parameters are optional.
|
2012-12-29 14:57:52 -04:00
|
|
|
|
2011-12-14 08:34:26 -04:00
|
|
|
.. versionchanged:: 3.3
|
|
|
|
:class:`scheduler` class can be safely used in multi-threaded
|
|
|
|
environments.
|
2011-11-22 08:33:34 -04:00
|
|
|
|
2007-08-15 11:28:22 -03:00
|
|
|
Example::
|
|
|
|
|
|
|
|
>>> import sched, time
|
2024-02-25 07:55:57 -04:00
|
|
|
>>> s = sched.scheduler(time.time, time.sleep)
|
2012-12-29 15:13:45 -04:00
|
|
|
>>> def print_time(a='default'):
|
|
|
|
... print("From print_time", time.time(), a)
|
2007-08-15 11:28:22 -03:00
|
|
|
...
|
|
|
|
>>> def print_some_times():
|
2007-09-04 04:15:32 -03:00
|
|
|
... print(time.time())
|
2012-12-29 15:13:45 -04:00
|
|
|
... s.enter(10, 1, print_time)
|
|
|
|
... s.enter(5, 2, print_time, argument=('positional',))
|
2022-12-24 01:21:52 -04:00
|
|
|
... # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
|
2012-12-29 15:13:45 -04:00
|
|
|
... s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
|
2022-12-24 01:21:52 -04:00
|
|
|
... s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
|
|
|
|
... s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
|
2007-08-15 11:28:22 -03:00
|
|
|
... s.run()
|
2007-09-04 04:15:32 -03:00
|
|
|
... print(time.time())
|
2007-08-15 11:28:22 -03:00
|
|
|
...
|
|
|
|
>>> print_some_times()
|
2022-12-24 01:21:52 -04:00
|
|
|
1652342830.3640375
|
|
|
|
From print_time 1652342830.3642538 second enterabs
|
|
|
|
From print_time 1652342830.3643398 first enterabs
|
|
|
|
From print_time 1652342835.3694863 positional
|
|
|
|
From print_time 1652342835.3696074 keyword
|
|
|
|
From print_time 1652342840.369612 default
|
|
|
|
1652342840.3697174
|
|
|
|
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
.. _scheduler-objects:
|
|
|
|
|
|
|
|
Scheduler Objects
|
|
|
|
-----------------
|
|
|
|
|
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r59987 | raymond.hettinger | 2008-01-15 21:52:42 +0100 (Tue, 15 Jan 2008) | 1 line
Refactor if/elif chain for clarity and speed. Remove dependency on subclasses having to implement _empty and _full.
........
r59988 | raymond.hettinger | 2008-01-15 22:22:47 +0100 (Tue, 15 Jan 2008) | 1 line
Fix-up half-written paragraph in the docs
........
r59989 | amaury.forgeotdarc | 2008-01-15 22:25:11 +0100 (Tue, 15 Jan 2008) | 3 lines
test_doctest fails since r59984.
Not sure if these are the correct values, but save_stdout has to be set before its usage...
........
r59992 | andrew.kuchling | 2008-01-16 01:32:03 +0100 (Wed, 16 Jan 2008) | 1 line
Docstring typos
........
r59993 | andrew.kuchling | 2008-01-16 04:17:25 +0100 (Wed, 16 Jan 2008) | 1 line
Add PEP 3141 section
........
r59998 | andrew.kuchling | 2008-01-16 14:01:51 +0100 (Wed, 16 Jan 2008) | 1 line
Markup fix
........
r59999 | georg.brandl | 2008-01-16 17:56:29 +0100 (Wed, 16 Jan 2008) | 2 lines
Fix MSDN library URL. (#1854)
........
r60006 | georg.brandl | 2008-01-16 21:27:56 +0100 (Wed, 16 Jan 2008) | 3 lines
Add Python-specific content to Doc dir. Update configuration file
to work with the newest Sphinx.
........
r60007 | georg.brandl | 2008-01-16 21:29:00 +0100 (Wed, 16 Jan 2008) | 2 lines
Doc build should work with 2.4 now.
........
r60009 | raymond.hettinger | 2008-01-17 00:38:16 +0100 (Thu, 17 Jan 2008) | 1 line
Minor wordsmithing.
........
r60010 | raymond.hettinger | 2008-01-17 00:40:45 +0100 (Thu, 17 Jan 2008) | 1 line
Add queues will alternative fetch orders (priority based and stack based).
........
r60011 | raymond.hettinger | 2008-01-17 00:49:35 +0100 (Thu, 17 Jan 2008) | 1 line
Add news entry.
........
r60013 | raymond.hettinger | 2008-01-17 04:02:14 +0100 (Thu, 17 Jan 2008) | 1 line
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
........
r60015 | gregory.p.smith | 2008-01-17 08:43:20 +0100 (Thu, 17 Jan 2008) | 3 lines
Comply with RFC 3207.
Fixes issue 829951 - http://bugs.python.org/issue829951
........
r60018 | gregory.p.smith | 2008-01-17 09:03:17 +0100 (Thu, 17 Jan 2008) | 2 lines
entry for r60015
........
r60019 | raymond.hettinger | 2008-01-17 09:07:05 +0100 (Thu, 17 Jan 2008) | 1 line
Note versionadded.
........
r60020 | gregory.p.smith | 2008-01-17 09:35:49 +0100 (Thu, 17 Jan 2008) | 8 lines
Fixes (accepts patch) issue1339 - http://bugs.python.org/issue1339
- Factor out the duplication of EHLO/HELO in login() and sendmail() to
a new function, ehlo_or_helo_if_needed().
- Use ehlo_or_helo_if_needed() in starttls()
- Check for the starttls exception in starttls() in the same way as
login() checks for the auth extension.
Contributed by Bill Fenner.
........
r60021 | andrew.kuchling | 2008-01-17 13:00:15 +0100 (Thu, 17 Jan 2008) | 1 line
Revise 3141 section a bit; add some Windows items
........
r60022 | brett.cannon | 2008-01-17 19:45:10 +0100 (Thu, 17 Jan 2008) | 2 lines
Fix a function pointer declaration to silence the compiler.
........
r60024 | raymond.hettinger | 2008-01-17 20:31:38 +0100 (Thu, 17 Jan 2008) | 1 line
Issue #1861: Add read-only attribute listing upcoming events in the order they will be run.
........
r60025 | andrew.kuchling | 2008-01-17 20:49:24 +0100 (Thu, 17 Jan 2008) | 1 line
Correction from Jordan Lewis: halfdelay() uses tenths of a second, not milliseconds
........
r60026 | raymond.hettinger | 2008-01-17 23:27:49 +0100 (Thu, 17 Jan 2008) | 1 line
Add advice on choosing between scheduler and threading.Timer().
........
r60028 | christian.heimes | 2008-01-18 00:01:44 +0100 (Fri, 18 Jan 2008) | 2 lines
Updated new property syntax. An elaborate example for subclassing and the getter was missing.
Added comment about VS 2008 and PGO builds.
........
r60029 | raymond.hettinger | 2008-01-18 00:32:01 +0100 (Fri, 18 Jan 2008) | 1 line
Fix-up Timer() example.
........
r60030 | raymond.hettinger | 2008-01-18 00:56:56 +0100 (Fri, 18 Jan 2008) | 1 line
Fix markup
........
r60031 | raymond.hettinger | 2008-01-18 01:10:42 +0100 (Fri, 18 Jan 2008) | 1 line
clearcache() needs to remove the dict as well as clear it.
........
r60033 | andrew.kuchling | 2008-01-18 03:26:16 +0100 (Fri, 18 Jan 2008) | 1 line
Bump verson
........
r60034 | andrew.kuchling | 2008-01-18 03:42:52 +0100 (Fri, 18 Jan 2008) | 1 line
Typo fix
........
r60035 | christian.heimes | 2008-01-18 08:30:20 +0100 (Fri, 18 Jan 2008) | 3 lines
Coverity issue CID #197
var_decl: Declared variable "stm" without initializer
ninit_use_in_call: Using uninitialized value "stm" (field "stm".tm_zone uninitialized) in call to function "mktime"
........
r60036 | christian.heimes | 2008-01-18 08:45:30 +0100 (Fri, 18 Jan 2008) | 11 lines
Coverity issue CID #167
Event alloc_fn: Called allocation function "metacompile" [model]
Event var_assign: Assigned variable "gr" to storage returned from "metacompile"
gr = metacompile(n);
Event pass_arg: Variable "gr" not freed or pointed-to in function "maketables" [model]
g = maketables(gr);
translatelabels(g);
addfirstsets(g);
Event leaked_storage: Returned without freeing storage "gr"
return g;
........
r60038 | christian.heimes | 2008-01-18 09:04:57 +0100 (Fri, 18 Jan 2008) | 3 lines
Coverity issue CID #182
size_error: Allocating 1 bytes to pointer "children", which needs at least 4 bytes
........
r60041 | christian.heimes | 2008-01-18 09:47:59 +0100 (Fri, 18 Jan 2008) | 4 lines
Coverity issue CID #169
local_ptr_assign_local: Assigning address of stack variable "namebuf" to pointer "filename"
out_of_scope: Variable "namebuf" goes out of scope
use_invalid: Used "filename" pointing to out-of-scope variable "namebuf"
........
r60042 | christian.heimes | 2008-01-18 09:53:45 +0100 (Fri, 18 Jan 2008) | 2 lines
Coverity CID #168
leaked_storage: Returned without freeing storage "fp"
........
2008-01-18 05:56:22 -04:00
|
|
|
:class:`scheduler` instances have the following methods and attributes:
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
|
2012-12-29 15:13:45 -04:00
|
|
|
.. method:: scheduler.enterabs(time, priority, action, argument=(), kwargs={})
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
Schedule a new event. The *time* argument should be a numeric type compatible
|
|
|
|
with the return value of the *timefunc* function passed to the constructor.
|
|
|
|
Events scheduled for the same *time* will be executed in the order of their
|
2017-11-25 01:43:01 -04:00
|
|
|
*priority*. A lower number represents a higher priority.
|
2007-08-15 11:28:22 -03:00
|
|
|
|
2011-11-22 08:33:34 -04:00
|
|
|
Executing the event means executing ``action(*argument, **kwargs)``.
|
2013-01-02 06:31:26 -04:00
|
|
|
*argument* is a sequence holding the positional arguments for *action*.
|
|
|
|
*kwargs* is a dictionary holding the keyword arguments for *action*.
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
Return value is an event which may be used for later cancellation of the event
|
|
|
|
(see :meth:`cancel`).
|
|
|
|
|
2011-11-22 08:33:34 -04:00
|
|
|
.. versionchanged:: 3.3
|
|
|
|
*argument* parameter is optional.
|
|
|
|
|
2018-07-05 21:01:16 -03:00
|
|
|
.. versionchanged:: 3.3
|
2011-11-22 08:33:34 -04:00
|
|
|
*kwargs* parameter was added.
|
2007-08-15 11:28:22 -03:00
|
|
|
|
2011-11-22 08:33:34 -04:00
|
|
|
|
2012-12-29 15:13:45 -04:00
|
|
|
.. method:: scheduler.enter(delay, priority, action, argument=(), kwargs={})
|
2007-08-15 11:28:22 -03:00
|
|
|
|
2011-10-28 06:22:25 -03:00
|
|
|
Schedule an event for *delay* more time units. Other than the relative time, the
|
2007-08-15 11:28:22 -03:00
|
|
|
other arguments, the effect and the return value are the same as those for
|
|
|
|
:meth:`enterabs`.
|
|
|
|
|
2011-11-22 08:33:34 -04:00
|
|
|
.. versionchanged:: 3.3
|
|
|
|
*argument* parameter is optional.
|
|
|
|
|
2018-07-05 21:01:16 -03:00
|
|
|
.. versionchanged:: 3.3
|
2011-11-22 08:33:34 -04:00
|
|
|
*kwargs* parameter was added.
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
.. method:: scheduler.cancel(event)
|
|
|
|
|
|
|
|
Remove the event from the queue. If *event* is not an event currently in the
|
2009-05-26 04:51:03 -03:00
|
|
|
queue, this method will raise a :exc:`ValueError`.
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. method:: scheduler.empty()
|
|
|
|
|
2019-11-12 10:57:03 -04:00
|
|
|
Return ``True`` if the event queue is empty.
|
2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
|
2011-12-14 09:38:45 -04:00
|
|
|
.. method:: scheduler.run(blocking=True)
|
2007-08-15 11:28:22 -03:00
|
|
|
|
2023-07-29 02:48:10 -03:00
|
|
|
Run all scheduled events. This method will wait (using the *delayfunc*
|
2007-08-15 11:28:22 -03:00
|
|
|
function passed to the constructor) for the next event, then execute it and so
|
|
|
|
on until there are no more scheduled events.
|
|
|
|
|
2013-11-29 06:17:13 -04:00
|
|
|
If *blocking* is false executes the scheduled events due to expire soonest
|
2012-03-15 09:05:41 -03:00
|
|
|
(if any) and then return the deadline of the next scheduled call in the
|
|
|
|
scheduler (if any).
|
2011-12-14 09:38:45 -04:00
|
|
|
|
2007-08-15 11:28:22 -03:00
|
|
|
Either *action* or *delayfunc* can raise an exception. In either case, the
|
|
|
|
scheduler will maintain a consistent state and propagate the exception. If an
|
|
|
|
exception is raised by *action*, the event will not be attempted in future calls
|
|
|
|
to :meth:`run`.
|
|
|
|
|
|
|
|
If a sequence of events takes longer to run than the time available before the
|
|
|
|
next event, the scheduler will simply fall behind. No events will be dropped;
|
|
|
|
the calling code is responsible for canceling events which are no longer
|
|
|
|
pertinent.
|
|
|
|
|
2018-07-05 21:01:16 -03:00
|
|
|
.. versionchanged:: 3.3
|
2011-12-14 09:38:45 -04:00
|
|
|
*blocking* parameter was added.
|
|
|
|
|
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r59987 | raymond.hettinger | 2008-01-15 21:52:42 +0100 (Tue, 15 Jan 2008) | 1 line
Refactor if/elif chain for clarity and speed. Remove dependency on subclasses having to implement _empty and _full.
........
r59988 | raymond.hettinger | 2008-01-15 22:22:47 +0100 (Tue, 15 Jan 2008) | 1 line
Fix-up half-written paragraph in the docs
........
r59989 | amaury.forgeotdarc | 2008-01-15 22:25:11 +0100 (Tue, 15 Jan 2008) | 3 lines
test_doctest fails since r59984.
Not sure if these are the correct values, but save_stdout has to be set before its usage...
........
r59992 | andrew.kuchling | 2008-01-16 01:32:03 +0100 (Wed, 16 Jan 2008) | 1 line
Docstring typos
........
r59993 | andrew.kuchling | 2008-01-16 04:17:25 +0100 (Wed, 16 Jan 2008) | 1 line
Add PEP 3141 section
........
r59998 | andrew.kuchling | 2008-01-16 14:01:51 +0100 (Wed, 16 Jan 2008) | 1 line
Markup fix
........
r59999 | georg.brandl | 2008-01-16 17:56:29 +0100 (Wed, 16 Jan 2008) | 2 lines
Fix MSDN library URL. (#1854)
........
r60006 | georg.brandl | 2008-01-16 21:27:56 +0100 (Wed, 16 Jan 2008) | 3 lines
Add Python-specific content to Doc dir. Update configuration file
to work with the newest Sphinx.
........
r60007 | georg.brandl | 2008-01-16 21:29:00 +0100 (Wed, 16 Jan 2008) | 2 lines
Doc build should work with 2.4 now.
........
r60009 | raymond.hettinger | 2008-01-17 00:38:16 +0100 (Thu, 17 Jan 2008) | 1 line
Minor wordsmithing.
........
r60010 | raymond.hettinger | 2008-01-17 00:40:45 +0100 (Thu, 17 Jan 2008) | 1 line
Add queues will alternative fetch orders (priority based and stack based).
........
r60011 | raymond.hettinger | 2008-01-17 00:49:35 +0100 (Thu, 17 Jan 2008) | 1 line
Add news entry.
........
r60013 | raymond.hettinger | 2008-01-17 04:02:14 +0100 (Thu, 17 Jan 2008) | 1 line
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
........
r60015 | gregory.p.smith | 2008-01-17 08:43:20 +0100 (Thu, 17 Jan 2008) | 3 lines
Comply with RFC 3207.
Fixes issue 829951 - http://bugs.python.org/issue829951
........
r60018 | gregory.p.smith | 2008-01-17 09:03:17 +0100 (Thu, 17 Jan 2008) | 2 lines
entry for r60015
........
r60019 | raymond.hettinger | 2008-01-17 09:07:05 +0100 (Thu, 17 Jan 2008) | 1 line
Note versionadded.
........
r60020 | gregory.p.smith | 2008-01-17 09:35:49 +0100 (Thu, 17 Jan 2008) | 8 lines
Fixes (accepts patch) issue1339 - http://bugs.python.org/issue1339
- Factor out the duplication of EHLO/HELO in login() and sendmail() to
a new function, ehlo_or_helo_if_needed().
- Use ehlo_or_helo_if_needed() in starttls()
- Check for the starttls exception in starttls() in the same way as
login() checks for the auth extension.
Contributed by Bill Fenner.
........
r60021 | andrew.kuchling | 2008-01-17 13:00:15 +0100 (Thu, 17 Jan 2008) | 1 line
Revise 3141 section a bit; add some Windows items
........
r60022 | brett.cannon | 2008-01-17 19:45:10 +0100 (Thu, 17 Jan 2008) | 2 lines
Fix a function pointer declaration to silence the compiler.
........
r60024 | raymond.hettinger | 2008-01-17 20:31:38 +0100 (Thu, 17 Jan 2008) | 1 line
Issue #1861: Add read-only attribute listing upcoming events in the order they will be run.
........
r60025 | andrew.kuchling | 2008-01-17 20:49:24 +0100 (Thu, 17 Jan 2008) | 1 line
Correction from Jordan Lewis: halfdelay() uses tenths of a second, not milliseconds
........
r60026 | raymond.hettinger | 2008-01-17 23:27:49 +0100 (Thu, 17 Jan 2008) | 1 line
Add advice on choosing between scheduler and threading.Timer().
........
r60028 | christian.heimes | 2008-01-18 00:01:44 +0100 (Fri, 18 Jan 2008) | 2 lines
Updated new property syntax. An elaborate example for subclassing and the getter was missing.
Added comment about VS 2008 and PGO builds.
........
r60029 | raymond.hettinger | 2008-01-18 00:32:01 +0100 (Fri, 18 Jan 2008) | 1 line
Fix-up Timer() example.
........
r60030 | raymond.hettinger | 2008-01-18 00:56:56 +0100 (Fri, 18 Jan 2008) | 1 line
Fix markup
........
r60031 | raymond.hettinger | 2008-01-18 01:10:42 +0100 (Fri, 18 Jan 2008) | 1 line
clearcache() needs to remove the dict as well as clear it.
........
r60033 | andrew.kuchling | 2008-01-18 03:26:16 +0100 (Fri, 18 Jan 2008) | 1 line
Bump verson
........
r60034 | andrew.kuchling | 2008-01-18 03:42:52 +0100 (Fri, 18 Jan 2008) | 1 line
Typo fix
........
r60035 | christian.heimes | 2008-01-18 08:30:20 +0100 (Fri, 18 Jan 2008) | 3 lines
Coverity issue CID #197
var_decl: Declared variable "stm" without initializer
ninit_use_in_call: Using uninitialized value "stm" (field "stm".tm_zone uninitialized) in call to function "mktime"
........
r60036 | christian.heimes | 2008-01-18 08:45:30 +0100 (Fri, 18 Jan 2008) | 11 lines
Coverity issue CID #167
Event alloc_fn: Called allocation function "metacompile" [model]
Event var_assign: Assigned variable "gr" to storage returned from "metacompile"
gr = metacompile(n);
Event pass_arg: Variable "gr" not freed or pointed-to in function "maketables" [model]
g = maketables(gr);
translatelabels(g);
addfirstsets(g);
Event leaked_storage: Returned without freeing storage "gr"
return g;
........
r60038 | christian.heimes | 2008-01-18 09:04:57 +0100 (Fri, 18 Jan 2008) | 3 lines
Coverity issue CID #182
size_error: Allocating 1 bytes to pointer "children", which needs at least 4 bytes
........
r60041 | christian.heimes | 2008-01-18 09:47:59 +0100 (Fri, 18 Jan 2008) | 4 lines
Coverity issue CID #169
local_ptr_assign_local: Assigning address of stack variable "namebuf" to pointer "filename"
out_of_scope: Variable "namebuf" goes out of scope
use_invalid: Used "filename" pointing to out-of-scope variable "namebuf"
........
r60042 | christian.heimes | 2008-01-18 09:53:45 +0100 (Fri, 18 Jan 2008) | 2 lines
Coverity CID #168
leaked_storage: Returned without freeing storage "fp"
........
2008-01-18 05:56:22 -04:00
|
|
|
.. attribute:: scheduler.queue
|
|
|
|
|
|
|
|
Read-only attribute returning a list of upcoming events in the order they
|
|
|
|
will be run. Each event is shown as a :term:`named tuple` with the
|
2012-12-29 14:57:52 -04:00
|
|
|
following fields: time, priority, action, argument, kwargs.
|