2007-08-15 11:28:01 -03:00
|
|
|
:mod:`sched` --- Event scheduler
|
|
|
|
================================
|
|
|
|
|
|
|
|
.. module:: sched
|
|
|
|
:synopsis: General purpose event scheduler.
|
|
|
|
.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
|
|
|
|
|
|
|
|
.. index:: single: event scheduling
|
|
|
|
|
|
|
|
The :mod:`sched` module defines a class which implements a general purpose event
|
|
|
|
scheduler:
|
|
|
|
|
|
|
|
|
|
|
|
.. class:: scheduler(timefunc, delayfunc)
|
|
|
|
|
|
|
|
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
|
|
|
|
units whatsoever). The *delayfunc* function should be callable with one
|
|
|
|
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.
|
|
|
|
|
|
|
|
Example::
|
|
|
|
|
|
|
|
>>> import sched, time
|
2008-03-22 19:04:10 -03:00
|
|
|
>>> s = sched.scheduler(time.time, time.sleep)
|
2007-08-15 11:28:01 -03:00
|
|
|
>>> def print_time(): print "From print_time", time.time()
|
|
|
|
...
|
|
|
|
>>> def print_some_times():
|
|
|
|
... print time.time()
|
|
|
|
... s.enter(5, 1, print_time, ())
|
|
|
|
... s.enter(10, 1, print_time, ())
|
|
|
|
... s.run()
|
|
|
|
... print time.time()
|
|
|
|
...
|
|
|
|
>>> print_some_times()
|
|
|
|
930343690.257
|
|
|
|
From print_time 930343695.274
|
|
|
|
From print_time 930343700.273
|
|
|
|
930343700.276
|
|
|
|
|
2008-01-17 18:27:49 -04:00
|
|
|
In multi-threaded environments, the :class:`scheduler` class has limitations
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
with respect to thread-safety, inability to insert a new task before
|
2008-01-17 22:42:52 -04:00
|
|
|
the one currently pending in a running scheduler, and holding up the main
|
2008-01-17 18:27:49 -04:00
|
|
|
thread until the event queue is empty. Instead, the preferred approach
|
|
|
|
is to use the :class:`threading.Timer` class instead.
|
|
|
|
|
|
|
|
Example::
|
|
|
|
|
|
|
|
>>> import time
|
|
|
|
>>> from threading import Timer
|
|
|
|
>>> def print_time():
|
|
|
|
... print "From print_time", time.time()
|
|
|
|
...
|
|
|
|
>>> def print_some_times():
|
|
|
|
... print time.time()
|
|
|
|
... Timer(5, print_time, ()).start()
|
2008-01-17 19:32:01 -04:00
|
|
|
... Timer(10, print_time, ()).start()
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
... time.sleep(11) # sleep while time-delay events execute
|
|
|
|
... print time.time()
|
2008-01-17 18:27:49 -04:00
|
|
|
...
|
|
|
|
>>> print_some_times()
|
|
|
|
930343690.257
|
|
|
|
From print_time 930343695.274
|
|
|
|
From print_time 930343700.273
|
2008-01-17 19:32:01 -04:00
|
|
|
930343701.301
|
2008-01-17 18:27:49 -04:00
|
|
|
|
2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
.. _scheduler-objects:
|
|
|
|
|
|
|
|
Scheduler Objects
|
|
|
|
-----------------
|
|
|
|
|
2008-01-17 15:31:38 -04:00
|
|
|
:class:`scheduler` instances have the following methods and attributes:
|
2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. method:: scheduler.enterabs(time, priority, action, argument)
|
|
|
|
|
|
|
|
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
|
|
|
|
*priority*.
|
|
|
|
|
|
|
|
Executing the event means executing ``action(*argument)``. *argument* must be a
|
|
|
|
sequence holding the parameters for *action*.
|
|
|
|
|
|
|
|
Return value is an event which may be used for later cancellation of the event
|
|
|
|
(see :meth:`cancel`).
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: scheduler.enter(delay, priority, action, argument)
|
|
|
|
|
|
|
|
Schedule an event for *delay* more time units. Other then the relative time, the
|
|
|
|
other arguments, the effect and the return value are the same as those for
|
|
|
|
:meth:`enterabs`.
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: scheduler.cancel(event)
|
|
|
|
|
|
|
|
Remove the event from the queue. If *event* is not an event currently in the
|
2009-05-26 04:50:52 -03:00
|
|
|
queue, this method will raise a :exc:`ValueError`.
|
2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. method:: scheduler.empty()
|
|
|
|
|
|
|
|
Return true if the event queue is empty.
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: scheduler.run()
|
|
|
|
|
|
|
|
Run all scheduled events. This function will wait (using the :func:`delayfunc`
|
|
|
|
function passed to the constructor) for the next event, then execute it and so
|
|
|
|
on until there are no more scheduled events.
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
2008-01-17 15:31:38 -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
|
|
|
|
following fields: time, priority, action, argument.
|
2008-01-17 19:56:56 -04:00
|
|
|
|
|
|
|
.. versionadded:: 2.6
|