Bläddra i källkod

CELERY_MAX_CACHED_RESULTS=-1 will now disable the result cache

Ask Solem 11 år sedan
förälder
incheckning
1ffea6ea42

+ 8 - 3
celery/backends/base.py

@@ -52,6 +52,12 @@ def unpickle_backend(cls, args, kwargs):
     return cls(*args, app=current_app._get_current_object(), **kwargs)
     return cls(*args, app=current_app._get_current_object(), **kwargs)
 
 
 
 
+class _nulldict(dict):
+
+    def __setitem__(self, k, v):
+        pass
+
+
 class BaseBackend(object):
 class BaseBackend(object):
     READY_STATES = states.READY_STATES
     READY_STATES = states.READY_STATES
     UNREADY_STATES = states.UNREADY_STATES
     UNREADY_STATES = states.UNREADY_STATES
@@ -90,9 +96,8 @@ class BaseBackend(object):
         (self.content_type,
         (self.content_type,
          self.content_encoding,
          self.content_encoding,
          self.encoder) = serializer_registry._encoders[self.serializer]
          self.encoder) = serializer_registry._encoders[self.serializer]
-        self._cache = LRUCache(
-            limit=max_cached_results or conf.CELERY_MAX_CACHED_RESULTS,
-        )
+        cmax = max_cached_results or conf.CELERY_MAX_CACHED_RESULTS
+        self._cache = _nulldict() if cmax == -1 else LRUCache(limit=cmax)
         self.accept = prepare_accept_content(
         self.accept = prepare_accept_content(
             conf.CELERY_ACCEPT_CONTENT if accept is None else accept,
             conf.CELERY_ACCEPT_CONTENT if accept is None else accept,
         )
         )

+ 4 - 4
celery/tests/backends/test_amqp.py

@@ -33,8 +33,8 @@ class test_AMQPBackend(AppCase):
         return AMQPBackend(self.app, **opts)
         return AMQPBackend(self.app, **opts)
 
 
     def test_mark_as_done(self):
     def test_mark_as_done(self):
-        tb1 = self.create_backend()
-        tb2 = self.create_backend()
+        tb1 = self.create_backend(max_cached_results=1)
+        tb2 = self.create_backend(max_cached_results=1)
 
 
         tid = uuid()
         tid = uuid()
 
 
@@ -175,7 +175,7 @@ class test_AMQPBackend(AppCase):
         class MockBackend(AMQPBackend):
         class MockBackend(AMQPBackend):
             Queue = MockBinding
             Queue = MockBinding
 
 
-        backend = MockBackend(self.app)
+        backend = MockBackend(self.app, max_cached_results=100)
         backend._republish = Mock()
         backend._republish = Mock()
 
 
         yield results, backend, Message
         yield results, backend, Message
@@ -262,7 +262,7 @@ class test_AMQPBackend(AppCase):
                 b.drain_events(Connection(), consumer, timeout=0.1)
                 b.drain_events(Connection(), consumer, timeout=0.1)
 
 
     def test_get_many(self):
     def test_get_many(self):
-        b = self.create_backend()
+        b = self.create_backend(max_cached_results=10)
 
 
         tids = []
         tids = []
         for i in range(10):
         for i in range(10):

+ 4 - 3
celery/tests/backends/test_base.py

@@ -234,9 +234,10 @@ class test_BaseBackend_dict(AppCase):
         self.assertIsInstance(self.b.prepare_value(g), self.app.GroupResult)
         self.assertIsInstance(self.b.prepare_value(g), self.app.GroupResult)
 
 
     def test_is_cached(self):
     def test_is_cached(self):
-        self.b._cache['foo'] = 1
-        self.assertTrue(self.b.is_cached('foo'))
-        self.assertFalse(self.b.is_cached('false'))
+        b = BaseBackend(app=self.app, max_cached_results=1)
+        b._cache['foo'] = 1
+        self.assertTrue(b.is_cached('foo'))
+        self.assertFalse(b.is_cached('false'))
 
 
 
 
 class test_KeyValueStoreBackend(AppCase):
 class test_KeyValueStoreBackend(AppCase):

+ 2 - 6
docs/configuration.rst

@@ -1142,12 +1142,8 @@ CELERY_MAX_CACHED_RESULTS
 Result backends caches ready results used by the client.
 Result backends caches ready results used by the client.
 
 
 This is the total number of results to cache before older results are evicted.
 This is the total number of results to cache before older results are evicted.
-The default is 5000.  0 or None means no limit.
-
-.. note::
-    
-    These results are kept in memory.  Reduce this setting if your Celery is utilizing
-    a large amount of memory.
+The default is 5000.  0 or None means no limit, and a value of :const:`-1`
+will disable the cache.
 
 
 .. setting:: CELERY_CHORD_PROPAGATES
 .. setting:: CELERY_CHORD_PROPAGATES