Quellcode durchsuchen

Fixes the OrderedDict KeyError by avoiding conccurent accesses.

rnoel vor 13 Jahren
Ursprung
Commit
aa65566340
1 geänderte Dateien mit 9 neuen und 3 gelöschten Zeilen
  1. 9 3
      celery/datastructures.py

+ 9 - 3
celery/datastructures.py

@@ -15,6 +15,7 @@ import traceback
 
 
 from itertools import chain
 from itertools import chain
 from Queue import Empty
 from Queue import Empty
+from threading import Lock
 
 
 from celery.utils.compat import OrderedDict
 from celery.utils.compat import OrderedDict
 
 
@@ -299,11 +300,16 @@ class LocalCache(OrderedDict):
     def __init__(self, limit=None):
     def __init__(self, limit=None):
         super(LocalCache, self).__init__()
         super(LocalCache, self).__init__()
         self.limit = limit
         self.limit = limit
+        self.lock = Lock()
 
 
     def __setitem__(self, key, value):
     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):
 class TokenBucket(object):