Thread processing

Paul Moore gustav at morpheus.demon.co.uk
Wed Mar 5 15:07:15 EST 2003


I've just started working with threads in Python, and I'm having a bit
of a hard time getting my head round the concepts.

One thing I can't work out how to do is to wait on a group of threads
and handle each one as it finishes. In Windows, I'd use
WaitForMultipleObjects(), but I can't find an equivalent for Python
threads.

I can join the threads in an arbitrary order

    for thread in threads:
        thread.join()
        # post-processing for thread here

but this doesn't let me handle each thread as it finishes. This can be
a problem, as one of my use cases is multiplexing 50 or more database
connections. Some of the connecions may fail with a timeout, taking
quite a long time to return an error. It would be a shame if the fast,
working connections had to wait behind one slow failure.

I can busy-wait, something like

    running = True
    while running:
        for thread in threads:
            if not thread.isAlive():
                thread.join()
                # post-processing for thread here

but I'm pretty sure busy waiting isn't the best way of dealing with
this...

I can use a Queue to have the threads notify when they have finished,
but that means rewriting the thread procedures to do the notification,
which isn't really what I want. Something like:

    q = Queue()
    # All the threads need to get q as input, and do
    # q.put(self) when the run method finishes

    while threads:
        thread = q.get()
        thread.join()
        threads.remove[thread]
        # post-processing for thread here

That's nasty because I have to write my thread procedures specifically
to work with this idiom (and I'm trying to make this stuff as generic
as possible, because I have a lot of potential code which will follow
this pattern)

I can't even think of a way of subclassing Thread, as the Thread class
is designed for (user) subclasses to override run(), so there's
nowhere I can put a "the user code has finished" hook, short of
digging into the internals.

Am I right in thinking that there isn't a good way of doing this? If
anyone can point out what I might have missed, I'd be very grateful.

In the absence of a simple WaitForMultipleObjects equivalent, I'll
probably go with a mixture of the join-in-arbitrary-order and the
Queue approaches. But neither really works for all the cases I care
about...

Thanks,
Paul.

PS Sorry I can't give a specific example - I'm trying to write a
   fairly generic library here - I have 4 main use cases already, with
   more appearing fairly fast... (Actually, I could probably describe
   my particular current problem if that would help, but this message
   is already too long, and I don't want to lose the general question
   in details of the one specific case...)
-- 
This signature intentionally left blank




More information about the Python-list mailing list