Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Commit f9401d7

Browse files
committed
Python issue 22448: cleanup _run_once(), only iterate once to remove delayed
calls that were cancelled.
1 parent f3e29d2 commit f9401d7

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

asyncio/base_events.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -994,19 +994,22 @@ def _run_once(self):
994994
'call_later' callbacks.
995995
"""
996996

997-
# Remove delayed calls that were cancelled if their number is too high
998997
sched_count = len(self._scheduled)
999998
if (sched_count > _MIN_SCHEDULED_TIMER_HANDLES and
1000999
self._timer_cancelled_count / sched_count >
10011000
_MIN_CANCELLED_TIMER_HANDLES_FRACTION):
1001+
# Remove delayed calls that were cancelled if their number
1002+
# is too high
1003+
new_scheduled = []
10021004
for handle in self._scheduled:
10031005
if handle._cancelled:
10041006
handle._scheduled = False
1007+
else:
1008+
new_scheduled.append(handle)
10051009

1006-
self._scheduled = [x for x in self._scheduled if not x._cancelled]
1010+
heapq.heapify(new_scheduled)
1011+
self._scheduled = new_scheduled
10071012
self._timer_cancelled_count = 0
1008-
1009-
heapq.heapify(self._scheduled)
10101013
else:
10111014
# Remove delayed calls that were cancelled from head of queue.
10121015
while self._scheduled and self._scheduled[0]._cancelled:

0 commit comments

Comments
 (0)