Not to beat a dead horse, but....

Liam Clarke wrote:

Oops, you probably want to do this then-

for i in range( 0, 3 ):
oThread = Thread( target=mainFunction ).start()


Thread.start() looks like it returns None.

#############################
In [23]: from threading import Thread

In [24]: import time

In [25]: def foo():
  ....:     print "doing..."
  ....:     time.sleep(15)
  ....:     print "done...."
  ....:

In [26]: t = Thread(target=foo).start()
doing...

In [27]: print t
None

In [28]: done....


In [28]: print t None

In [29]: t = Thread(target=foo)

In [30]: t.start()
doing...

In [31]: t.isAlive()
Out[31]: True

In [32]: done....


In [32]: t.isAlive() Out[32]: False #############################

So, checking the return of Thread.start() doesn't seem like it would do what you think it would do. You probably want to get the thread object and check that directly with isAlive(). Oh, and if you spawn a bunch of threads at once and you want to wait until the all complete before doing something else, do something like this:

#############################
#create a list to contain the threads
thread_list = []
for i in range(10):
   t = Thread(target=foo)
   print "creating thread", t
   #put each thread in the list
   thread_list.append(t)

#iterate over thread list and start each thread
for t in thread_list:
   print "starting thread", t
   t.start()

#iterate over thread list and wait for each thread
for t in thread_list:
   print "waiting for thread", t
   while 1:
       if not t.isAlive():
           break
       time.sleep(.2)
#############################

It'll give you output something like this:

#############################
creating thread <Thread(Thread-35, initial)>
creating thread <Thread(Thread-36, initial)>
creating thread <Thread(Thread-37, initial)>
creating thread <Thread(Thread-38, initial)>
creating thread <Thread(Thread-39, initial)>
creating thread <Thread(Thread-40, initial)>
creating thread <Thread(Thread-41, initial)>
creating thread <Thread(Thread-42, initial)>
creating thread <Thread(Thread-43, initial)>
creating thread <Thread(Thread-44, initial)>
starting thread <Thread(Thread-35, initial)>
starting thread <Thread(Thread-36, initial)>
starting thread <Thread(Thread-37, initial)>
starting thread <Thread(Thread-38, initial)>
doing...
starting thread <Thread(Thread-39, initial)>
doing...
doing...
starting thread <Thread(Thread-40, initial)>
doing...
starting thread doing...
<Thread(Thread-41, initial)>
doing...
starting thread <Thread(Thread-42, initial)>
starting thread <Thread(Thread-43, initial)>
starting thread <Thread(Thread-44, initial)>
doing...
doing...
doing...
waiting for thread <Thread(Thread-35, started)>
doing...
done....
done....
done....
done....
done....
done....
waiting for thread <Thread(Thread-36, stopped)>
waiting for thread <Thread(Thread-37, stopped)>
waiting for thread done....
done....
done....
done....
<Thread(Thread-38, stopped)>
waiting for thread <Thread(Thread-39, stopped)>
waiting for thread <Thread(Thread-40, stopped)>
waiting for thread <Thread(Thread-41, stopped)>
waiting for thread <Thread(Thread-42, stopped)>
waiting for thread <Thread(Thread-43, stopped)>
waiting for thread <Thread(Thread-44, stopped)>
#################################

But in this situation, I totally agree with Max. You don't need threads for this. Just use os.system. You could use one of the popens (or the new subprocess module - never used that one myself), but os.system blocks until the called program exits.

while oThread: print 'sleeping 3 seconds'
time.sleep( 3 )


A if <condition> generally has an implicit else: pass clause as I
think of it, so it will just keep reiterating if the condition isn't
met.



Jeremy Joens _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor

Reply via email to