]> granicus.if.org Git - python/commitdiff
Issue #22448: asyncio, cleanup _run_once(), only iterate once to remove delayed
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 30 Sep 2014 16:08:36 +0000 (18:08 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 30 Sep 2014 16:08:36 +0000 (18:08 +0200)
calls that were cancelled.

Lib/asyncio/base_events.py

index 5aaf58f9f1e1c159dcb1190360d1444f3b486e65..3cff72abb5286500732a72d9af3ff354c1a56337 100644 (file)
@@ -994,19 +994,22 @@ class BaseEventLoop(events.AbstractEventLoop):
         'call_later' callbacks.
         """
 
-        # Remove delayed calls that were cancelled if their number is too high
         sched_count = len(self._scheduled)
         if (sched_count > _MIN_SCHEDULED_TIMER_HANDLES and
             self._timer_cancelled_count / sched_count >
                 _MIN_CANCELLED_TIMER_HANDLES_FRACTION):
+            # Remove delayed calls that were cancelled if their number
+            # is too high
+            new_scheduled = []
             for handle in self._scheduled:
                 if handle._cancelled:
                     handle._scheduled = False
+                else:
+                    new_scheduled.append(handle)
 
-            self._scheduled = [x for x in self._scheduled if not x._cancelled]
+            heapq.heapify(new_scheduled)
+            self._scheduled = new_scheduled
             self._timer_cancelled_count = 0
-
-            heapq.heapify(self._scheduled)
         else:
             # Remove delayed calls that were cancelled from head of queue.
             while self._scheduled and self._scheduled[0]._cancelled: