diff options
author | Bar Harel <bzvi7919@gmail.com> | 2020-10-19 07:33:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-19 07:33:43 (GMT) |
commit | 5368c2b6e23660cbce7e38dc68f859c66ac349ee (patch) | |
tree | e578050496dd95207d5e4b6a97b05cb47697c7fb /Lib/sched.py | |
parent | 155938907c2b3df71608ddeaa0a43d2ec1f2c699 (diff) | |
download | cpython-5368c2b6e23660cbce7e38dc68f859c66ac349ee.zip cpython-5368c2b6e23660cbce7e38dc68f859c66ac349ee.tar.gz cpython-5368c2b6e23660cbce7e38dc68f859c66ac349ee.tar.bz2 |
bpo-19270: Fixed sched.scheduler.cancel to cancel correct event (GH-22729)
Diffstat (limited to 'Lib/sched.py')
-rw-r--r-- | Lib/sched.py | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/Lib/sched.py b/Lib/sched.py index ff87874..14613cf 100644 --- a/Lib/sched.py +++ b/Lib/sched.py @@ -26,23 +26,19 @@ has another way to reference private data (besides global variables). import time import heapq from collections import namedtuple +from itertools import count import threading from time import monotonic as _time __all__ = ["scheduler"] -class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')): - __slots__ = [] - def __eq__(s, o): return (s.time, s.priority) == (o.time, o.priority) - def __lt__(s, o): return (s.time, s.priority) < (o.time, o.priority) - def __le__(s, o): return (s.time, s.priority) <= (o.time, o.priority) - def __gt__(s, o): return (s.time, s.priority) > (o.time, o.priority) - def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority) - +Event = namedtuple('Event', 'time, priority, sequence, action, argument, kwargs') Event.time.__doc__ = ('''Numeric type compatible with the return value of the timefunc function passed to the constructor.''') Event.priority.__doc__ = ('''Events scheduled for the same time will be executed in the order of their priority.''') +Event.sequence.__doc__ = ('''A continually increasing sequence number that + separates events if time and priority are equal.''') Event.action.__doc__ = ('''Executing the event means executing action(*argument, **kwargs)''') Event.argument.__doc__ = ('''argument is a sequence holding the positional @@ -61,6 +57,7 @@ class scheduler: self._lock = threading.RLock() self.timefunc = timefunc self.delayfunc = delayfunc + self._sequence_generator = count() def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel): """Enter a new event in the queue at an absolute time. @@ -71,8 +68,10 @@ class scheduler: """ if kwargs is _sentinel: kwargs = {} - event = Event(time, priority, action, argument, kwargs) + with self._lock: + event = Event(time, priority, next(self._sequence_generator), + action, argument, kwargs) heapq.heappush(self._queue, event) return event # The ID @@ -136,7 +135,8 @@ class scheduler: with lock: if not q: break - time, priority, action, argument, kwargs = q[0] + (time, priority, sequence, action, + argument, kwargs) = q[0] now = timefunc() if time > now: delay = True |