On Thu, 27 Apr 2006, Yura Smolsky wrote:

I have following program. It should starts threads and then frees
them. When I use for this task threading.Thread then there are not
leaks here. When I use PyLucene.PythonThread then I got very noticeable
memory leak.
PyLucene is last from trunk. Python is 2.4.2. Tested on winXP and debian 
systems.

#!/usr/bin/python2.4

import PyLucene
import time

def funny(num):
   l = []
   l.append(num)
   #time.sleep(0.001)

ths = []
for i in range(1000000):
   th = PyLucene.PythonThread(target=funny, args=[i])
   th.start()


 Hello Yura,

Indeed there is quite a leak. I was able to reproduce the bug you found. With the attached patch, a potential fix, after about half a minute the process size stabilizes at around 38Mb on my Mac.
Could you please verify that it solves the issue for you too ?

Thanks !

Andi..
Index: PyLucene.py
===================================================================
--- PyLucene.py (revision 262)
+++ PyLucene.py (working copy)
@@ -45,14 +45,6 @@
     happy, any python thread using libgcj must be of this class.
     """
 
-    class runnable(object):
-
-        def __init__(self, callable):
-            self.callable = callable
-
-        def run(self):
-            self.callable()
-
     def __init__(self, *args, **kwds):
 
         super(PythonThread, self).__init__(*args, **kwds)
@@ -63,12 +55,22 @@
         current = threading.currentThread()
         assert (current.getName() == 'MainThread' or isinstance(current, 
PythonThread)), "PythonThread can only be started from main thread of from 
another PythonThread"
         
+        class runnable(object):
+            def __init__(_self, callable):
+                _self.callable = callable
+            def run(_self):
+                try:
+                    _self.callable()
+                finally:
+                    del _self.callable
+                    self.javaThread = None
+
         threading._active_limbo_lock.acquire()
         threading._limbo[self] = self
         threading._active_limbo_lock.release()
         
-        runnable = PythonThread.runnable(self._Thread__bootstrap)
-        thread = self.javaThread = Thread(runnable, self.getName())
+        thread = self.javaThread = Thread(runnable(self._Thread__bootstrap),
+                                          self.getName())
         thread.start()
 
         self._Thread__started = True
_______________________________________________
pylucene-dev mailing list
[email protected]
http://lists.osafoundation.org/mailman/listinfo/pylucene-dev

Reply via email to