Stop a thread on deletion

Sjoerd Op 't Land sjoerd at intercue.nl
Wed Aug 8 16:11:52 EDT 2007


Dear Cris,

Thanks a lot. This works! (What you didn't know, there was already such 
a 'proxy' object in the design, so it isn't the hack it looks ;).)

Thanks again,
Sjoerd Op 't Land

Chris Mellon schreef:
> On 8/8/07, Sjoerd Op 't Land <sjoerd at intercue.nl> wrote:
>> Hello all,
>>
>> I'm using threading for generating video content. The trouble is how to
>> kill the thread, because there are multiple (simultaneous) owners of a
>> thread. Ideally, a flag would be set when the reference count of the
>> thread becomes zero, causing the run() loop to quit. Example:
>>
>> import threading
>> import time
>> import gc
>>
>> class myThread(threading.Thread):
>>    def __init__(self):
>>      self.passedOut = threading.Event()
>>      threading.Thread.__init__(self)
>>    def __del__(self):
>>      self.passedOut.set()
>>    def run(self):
>>      i = 0
>>      while not self.passedOut.isSet():
>>        i += 1
>>        print "Hi %d" % i
>>        time.sleep(0.25)
>>
>>
>> a = myThread()
>> a.start()
>> time.sleep(2.5)
>> a = None
>> time.sleep(2.5)
>>
>> Unfortunately, this doesn't work. When I remove the while-loop, __del__
>> is called, actually. Appearantly there is still some reference to the
>> thread while it is running.
>>
>> I tried gc.get_referrers(self), but it seems to need some parsing. I'm
>> not sure how to implement that and I'm not sure whether it will work
>> always or not.
>>
> 
> gc.get_referrers returns a list of object instances that hold a
> reference to the object. The important one in this case is, of course,
> the thread itself. The thread holds a reference to the run method
> which (of course) requires a reference to the object. In other words,
> a running thread cannot be refcounted to zero. You are going to need a
> better method of handling your resources.
> 
> Perhaps instead of holding a reference to the thread, they could hold
> a reference to a proxy object:
> 
> import threading
> import time
> import gc
> import pprint
> 
> class myThread(threading.Thread):
>     def __init__(self):
>         self.passedOut = threading.Event()
>         threading.Thread.__init__(self)
>     def run(self):
>         i = 0
>         while not self.passedOut.isSet():
>           i += 1
>           print "Hi %d" % i
>           time.sleep(1)
>         print "stopped"
> 
> 
> class ThreadProxy(object):
>     def __init__(self, proxy_for):
>         self.proxy_for = proxy_for
>     def __del__(self):
>         self.proxy_for.passedOut.set()
>     def start(self):
>         self.proxy_for.start()



More information about the Python-list mailing list