mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
Issue #16165: Fix sched.scheduler.run() method was block a scheduler for
other threads.
This commit is contained in:
parent
c04957bff3
commit
f2b9cf4e61
3 changed files with 60 additions and 20 deletions
40
Lib/sched.py
40
Lib/sched.py
|
@ -128,27 +128,29 @@ class scheduler:
|
|||
"""
|
||||
# localize variable access to minimize overhead
|
||||
# and to improve thread safety
|
||||
with self._lock:
|
||||
q = self._queue
|
||||
delayfunc = self.delayfunc
|
||||
timefunc = self.timefunc
|
||||
pop = heapq.heappop
|
||||
while q:
|
||||
time, priority, action, argument, kwargs = checked_event = q[0]
|
||||
lock = self._lock
|
||||
q = self._queue
|
||||
delayfunc = self.delayfunc
|
||||
timefunc = self.timefunc
|
||||
pop = heapq.heappop
|
||||
while True:
|
||||
with lock:
|
||||
if not q:
|
||||
break
|
||||
time, priority, action, argument, kwargs = q[0]
|
||||
now = timefunc()
|
||||
if now < time:
|
||||
if not blocking:
|
||||
return time - now
|
||||
delayfunc(time - now)
|
||||
if time > now:
|
||||
delay = True
|
||||
else:
|
||||
event = pop(q)
|
||||
# Verify that the event was not removed or altered
|
||||
# by another thread after we last looked at q[0].
|
||||
if event is checked_event:
|
||||
action(*argument, **kwargs)
|
||||
delayfunc(0) # Let other threads run
|
||||
else:
|
||||
heapq.heappush(q, event)
|
||||
delay = False
|
||||
pop(q)
|
||||
if delay:
|
||||
if not blocking:
|
||||
return time - now
|
||||
delayfunc(time - now)
|
||||
else:
|
||||
action(*argument, **kwargs)
|
||||
delayfunc(0) # Let other threads run
|
||||
|
||||
@property
|
||||
def queue(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue