Browse Source

Fixes a memory leak when using the thread pool. Closes #486.

Kornelijus Survila 13 years ago
parent
commit
209293ece6
2 changed files with 12 additions and 0 deletions
  1. 1 0
      AUTHORS
  2. 11 0
      celery/concurrency/threads.py

+ 1 - 0
AUTHORS

@@ -51,6 +51,7 @@ Jonas Haag <jonas@lophus.org>
 Jonatan Heyman <jonatan@heyman.info>
 Jonatan Heyman <jonatan@heyman.info>
 Juarez Bochi <jbochi@gmail.com>
 Juarez Bochi <jbochi@gmail.com>
 Kevin Tran <hekevintran@gmail.com>
 Kevin Tran <hekevintran@gmail.com>
+Kornelijus Survila <kornholijo@gmail.com>
 Leo Dirac <leo@banyanbranch.com>
 Leo Dirac <leo@banyanbranch.com>
 Lukas Linhart <lukas.linhart@centrumholdings.com>
 Lukas Linhart <lukas.linhart@centrumholdings.com>
 Marcin Kuźmiński <marcin@python-works.com>
 Marcin Kuźmiński <marcin@python-works.com>

+ 11 - 0
celery/concurrency/threads.py

@@ -1,8 +1,16 @@
 from __future__ import absolute_import
 from __future__ import absolute_import
 
 
+from UserDict import UserDict
+
 from .base import apply_target, BasePool
 from .base import apply_target, BasePool
 
 
 
 
+class NullDict(UserDict):
+
+    def __setitem__(self, key, value):
+        pass
+
+
 class TaskPool(BasePool):
 class TaskPool(BasePool):
 
 
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
@@ -17,6 +25,9 @@ class TaskPool(BasePool):
 
 
     def on_start(self):
     def on_start(self):
         self._pool = self.ThreadPool(self.limit)
         self._pool = self.ThreadPool(self.limit)
+        # threadpool stores all work requests until they are processed
+        # we don't need this dict, and it occupies way too much memory.
+        self._pool.workRequests = NullDict()
 
 
     def on_stop(self):
     def on_stop(self):
         self._pool.dismissWorkers(self.limit, do_join=True)
         self._pool.dismissWorkers(self.limit, do_join=True)