[Tutor] Waiting until a thread ends

lists lists at justuber.com
Fri Mar 18 01:00:44 CET 2011


> Only really glanced at this, but you seem to be checking only the last
>> thread *after* the loop?  Surely you should be storing all the threads in a
>> list (or someplace) as you create them, and then check them all for liveness
>> and if so join them each in turn, to ensure you only print 'FINISHED' once
>> you've checked and confirmed that all the threads created have in fact
>> finished.
>>
>> Walter
>>
>>
> That makes absolute sense. Doh on my part!
>
> Thanks!
>
>
Just done a little more reading and came across this in an O'Reilly article
here http://www.oreillynet.com/onlamp/blog/2008/01/pymotw_threading.html

Seems like an elegant way to accomplish a wait until all running threads
have finished.

Using enumerate() to wait for all running threads:

It is not necessary to retain an explicit handle to all of the daemon
threads you start in order to ensure they have completed before exiting the
main process. threading.enumerate()returns a list of active Thread instances.
The list includes the current thread, and since joining the current thread
is not allowed (it introduces a deadlock situation), we must check before
joining.


import randomimport threadingimport time
def worker():
    """thread worker function"""
    t = threading.currentThread()
    pause = random.randint(1,5)
    print 'Starting:', t.getName(), 'sleeping', pause
    time.sleep(pause)
    print 'Ending  :', t.getName()
    return
for i in range(3):
    t = threading.Thread(target=worker)
    t.setDaemon(True)
    t.start()
main_thread = threading.currentThread()for t in threading.enumerate():
    if t is main_thread:
        continue
    print 'Joining :', t.getName()
    t.join()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110318/ef2a24ee/attachment.html>


More information about the Tutor mailing list