Przeglądaj źródła

timer2: Clear scheduler queue inline in a single atomic operation

Ask Solem 14 lat temu
rodzic
commit
eb4e5b8bf7
1 zmienionych plików z 7 dodań i 5 usunięć
  1. 7 5
      celery/utils/timer2.py

+ 7 - 5
celery/utils/timer2.py

@@ -92,23 +92,24 @@ class Schedule(object):
         nowfun = time
         nowfun = time
         pop = heapq.heappop
         pop = heapq.heappop
         max_interval = self.max_interval
         max_interval = self.max_interval
+        queue = self._queue
 
 
         while 1:
         while 1:
-            if self._queue:
-                eta, priority, entry = verify = self._queue[0]
+            if queue:
+                eta, priority, entry = verify = queue[0]
                 now = nowfun()
                 now = nowfun()
 
 
                 if now < eta:
                 if now < eta:
                     yield min(eta - now, max_interval), None
                     yield min(eta - now, max_interval), None
                 else:
                 else:
-                    event = pop(self._queue)
+                    event = pop(queue)
 
 
                     if event is verify:
                     if event is verify:
                         if not entry.cancelled:
                         if not entry.cancelled:
                             yield None, entry
                             yield None, entry
                         continue
                         continue
                     else:
                     else:
-                        heapq.heappush(self._queue, event)
+                        heapq.heappush(queue, event)
             yield None, None
             yield None, None
 
 
     def empty(self):
     def empty(self):
@@ -116,7 +117,8 @@ class Schedule(object):
         return not self._queue
         return not self._queue
 
 
     def clear(self):
     def clear(self):
-        self._queue = []
+        self._queue[:] = []  # used because we can't replace the object
+                             # and the operation is atomic.
 
 
     def info(self):
     def info(self):
         return ({"eta": eta, "priority": priority, "item": item}
         return ({"eta": eta, "priority": priority, "item": item}