changeset: 92675:b85ed8bb7523 branch: 3.4 parent: 92656:eb2bf1c2f654 user: Victor Stinner date: Tue Sep 30 18:08:36 2014 +0200 files: Lib/asyncio/base_events.py description: Issue #22448: asyncio, cleanup _run_once(), only iterate once to remove delayed calls that were cancelled. diff -r eb2bf1c2f654 -r b85ed8bb7523 Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py Tue Sep 30 13:54:14 2014 +0200 +++ b/Lib/asyncio/base_events.py Tue Sep 30 18:08:36 2014 +0200 @@ -994,19 +994,22 @@ '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: