Explorar o código

Fixes the OrderedDict KeyError by avoiding conccurent accesses.

rnoel %!s(int64=13) %!d(string=hai) anos
pai
achega
aa65566340
Modificáronse 1 ficheiros con 9 adicións e 3 borrados
  1. 9 3
      celery/datastructures.py

+ 9 - 3
celery/datastructures.py

@@ -15,6 +15,7 @@ import traceback
 
 from itertools import chain
 from Queue import Empty
+from threading import Lock
 
 from celery.utils.compat import OrderedDict
 
@@ -299,11 +300,16 @@ class LocalCache(OrderedDict):
     def __init__(self, limit=None):
         super(LocalCache, self).__init__()
         self.limit = limit
+        self.lock = Lock()
 
     def __setitem__(self, key, value):
-        while len(self) >= self.limit:
-            self.popitem(last=False)
-        super(LocalCache, self).__setitem__(key, value)
+        self.lock.acquire()   
+        try:
+            while len(self) >= self.limit:
+                self.popitem(last=False)
+            super(LocalCache, self).__setitem__(key, value)
+        finally:
+          self.lock.release()
 
 
 class TokenBucket(object):