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 <[EMAIL PROTECTED]> 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() -- http://mail.python.org/mailman/listinfo/python-list