Prev: Problems with extra blank line when using csv.writer in Python 3.1
Next: How to use a class property to store function variables?
From: Michal M on 27 Apr 2010 16:45 Hi I've just found out that one of objects is not destroyed when it should be. This means that something was holding reference to this object or part of it (i.e. method). Is there any way to check what holds that reference? I am unable to do that just looking to the code or debugging it because it is pretty complicated, but I am able to invoke this situation again. Regards Michal M.
From: Chris Rebert on 27 Apr 2010 17:08 On Tue, Apr 27, 2010 at 1:45 PM, Michal M <mich.mierzwa(a)googlemail.com> wrote: > I've just found out that one of objects is not destroyed when it > should be. This means that something was holding reference to this > object or part of it (i.e. method). Is there any way to check what > holds that reference? I am unable to do that just looking to the code > or debugging it because it is pretty complicated, but I am able to > invoke this situation again. gc.get_referrers(your_object) ? Docs: http://docs.python.org/library/gc.html#gc.get_referrers Cheers, Chris -- Thanks for having me learn something new today! http://blog.rebertia.com
From: Duncan Booth on 27 Apr 2010 17:21 Michal M <mich.mierzwa(a)googlemail.com> wrote: > Hi > > I've just found out that one of objects is not destroyed when it > should be. This means that something was holding reference to this > object or part of it (i.e. method). Is there any way to check what > holds that reference? I am unable to do that just looking to the code > or debugging it because it is pretty complicated, but I am able to > invoke this situation again. > See if this code helps: http://groups.google.com/group/comp.lang.python/browse_thread/thread/394ba5b48f83ebfb/237dc92f3629dd9a#237dc92f3629dd9a It's pretty old so it may need some adjustment, but I wrote it to figure out exactly that sort of problem.
From: Michal M on 27 Apr 2010 17:42 On 27 Kwi, 23:21, Duncan Booth <duncan.bo...(a)invalid.invalid> wrote: > Michal M <mich.mier...(a)googlemail.com> wrote: > > Hi > > > I've just found out that one of objects is not destroyed when it > > should be. This means that something was holding reference to this > > object or part of it (i.e. method). Is there any way to check what > > holds that reference? I am unable to do that just looking to the code > > or debugging it because it is pretty complicated, but I am able to > > invoke this situation again. > > See if this code helps: > > http://groups.google.com/group/comp.lang.python/browse_thread/thread/... > > It's pretty old so it may need some adjustment, but I wrote it > to figure out exactly that sort of problem. Thanks you for answers. I tried to use gc.get_referrers(self) in point in code when according to me object should be destroyed earlier but I did not see anything interesting. Then just realised that gc will not destroy object even when itself holds reference to his own method. For example class A(object): def a(self): pass def b(self): self.method = self.a def __del__(self): print "A object deleted" >> a = A() >> del a A object delted >> a = A() >> a.b() >> del a .... nothing ... I thought gc would discover such circle loops but apparently it did not.
From: Chris Rebert on 27 Apr 2010 17:58
On Tue, Apr 27, 2010 at 2:42 PM, Michal M <mich.mierzwa(a)googlemail.com> wrote: > On 27 Kwi, 23:21, Duncan Booth <duncan.bo...(a)invalid.invalid> wrote: >> Michal M <mich.mier...(a)googlemail.com> wrote: >> > I've just found out that one of objects is not destroyed when it >> > should be. This means that something was holding reference to this >> > object or part of it (i.e. method). Is there any way to check what >> > holds that reference? I am unable to do that just looking to the code >> > or debugging it because it is pretty complicated, but I am able to >> > invoke this situation again. >> >> See if this code helps: >> >> http://groups.google.com/group/comp.lang.python/browse_thread/thread/... >> >> It's pretty old so it may need some adjustment, but I wrote it >> to figure out exactly that sort of problem. > > Thanks you for answers. > I tried to use gc.get_referrers(self) in point in code when according > to me object should be destroyed earlier but I did not see anything > interesting. Then just realised that gc will not destroy object even > when itself holds reference to his own method. > > For example > > class A(object): > Â def a(self): > Â Â pass > Â def b(self): > Â Â self.method = self.a > Â def __del__(self): > Â Â print "A object deleted" > >>> a = A() >>> del a > A object delted >>> a = A() >>> a.b() >>> del a > ... nothing ... > > I thought gc would discover such circle loops but apparently it did > not. No, it does, you just didn't give it long enough; for performance reasons, cyclical GC is only done every so often: >>> from weakref import ref >>> class A(object): .... def a(self): .... pass .... def b(self): .... self.method = self.a .... >>> a = A() >>> def bye(x): print "BYE:", x .... >>> b = ref(a, bye) >>> del a BYE: <weakref at 0x377990; dead> >>> a = A() >>> b = ref(a, bye) >>> a.b() >>> del a >>> >>> #indeed, it didn't get GC-ed immediately >>> from gc import collect >>> collect() #but if we force a cyclical GC run... BYE: <weakref at 0x4441b0; dead> Cheers, Chris -- http://blog.rebertia.com |