1.Thread.join([timeout])
Wait until the thread terminates. This blocks the calling thread until the thread whose join() method is called terminates – either normally or through an unhandled exception – or until the optional timeout occurs.
等待进程结束。也就是说,其屏蔽调用线程,直到此线程方法终止(要么正常执行完毕,或者未处理的异常,或者时间超时)
下面通过例子来说明:
没有设定timeout情况,Main 线程启动,work1 和work2 线程执行,完毕退出,Main线程执行终止
1 import os 2 import threading 3 import time 4 import logging 5 import random 6 7 def work1(): 8 count=0 9 while count<=5: 10 threadname= threading.currentThread() 11 wait_time=random.randrange(1,4) 12 print("%s,count =%s wait for =%s s,time %s "%(threadname,count,wait_time,time.ctime()[-13:])) 13 time.sleep(wait_time) 14 count +=1 15 16 def work2(): 17 i=0 18 while i<=5: 19 threadname= threading.currentThread() 20 wait_time=random.randrange(1,4) 21 print("%s,i =%s wait for =%s s,time %s "%(threadname,i,wait_time,time.ctime()[-13:])) 22 time.sleep(wait_time) 23 i +=1 24 25 if __name__ =="__main__": 26 mainthread= threading.currentThread() 27 print ‘%s main thread is waiting for exit‘% mainthread 28 test1=threading.Thread(name=‘work1‘,target=work1) 29 test2=threading.Thread(name=‘work2‘,target=work2) 30 test1.start() 31 test2.start() 32 test1.join() 33 test2.join() 34 print ‘main thread finish‘
2个线程设定超时时间work1 5s,work2 4s,9s之后调用线程结束而不等待超时的线程:
1 import os 2 import threading 3 import time 4 import logging 5 import random 6 7 def work1(): 8 count=0 9 while count<=5: 10 threadname= threading.currentThread() 11 wait_time=random.randrange(1,4) 12 print("%s,count =%s wait for =%s s,time %s "%(threadname,count,wait_time,time.ctime()[-13:])) 13 time.sleep(wait_time) 14 count +=1 15 16 def work2(): 17 i=0 18 while i<=5: 19 threadname= threading.currentThread() 20 wait_time=random.randrange(1,4) 21 print("%s,i =%s wait for =%s s,time %s "%(threadname,i,wait_time,time.ctime()[-13:])) 22 time.sleep(wait_time) 23 i +=1 24 25 if __name__ =="__main__": 26 mainthread= threading.currentThread() 27 print ‘%s main thread is waiting for exit‘% mainthread 28 test1=threading.Thread(name=‘work1‘,target=work1) 29 test2=threading.Thread(name=‘work2‘,target=work2) 30 test1.start() 31 test2.start() 32 test1.join(4) 33 test2.join(5) 34 print ‘main thread finish
2.Producer and comsumer
1 import Queue 2 import threading 3 import random 4 5 #writelock =threading.Lock() 6 class Producer(threading.Thread): 7 def __init__(self,q,con,name): 8 super(Producer,self).__init__() 9 self.q = q 10 self.con = con 11 self.name = name 12 print "produce" +self.name+"started" 13 def run(self): 14 while 1: 15 #global writelock 16 self.con.acquire()#acquire the lock 17 if self.q.full():#if queue is full 18 #with writelock:#output info 19 print "queue is full, producer wait" 20 self.con.wait()#wait for resource 21 else: 22 value = random.ranint(0,10) 23 #with writelock: 24 print self.name+"put value"+self.name+":"+str(value)+"into queue" 25 self.q.put((self.name+":"+str(value)))#put to queue 26 self.con.notify()#inform consumer 27 self.con.release()#release the lock 28 29 class Consumer(threading.Thread): 30 def __init__(self,q,con,name): 31 super(Consumer,self).__init__() 32 self.q = q 33 self.con = con 34 self.name = name 35 print "consume" +self.name+"started\n" 36 def run(self): 37 while 1: 38 #global writelock 39 self.con.acquire() 40 if self.q.empty():#if empty 41 #with writelock: 42 print "queue is empty,consumer wait" 43 self.con.wait()#wait the resource ready 44 else: 45 value = self.q.get()#get one element from queue 46 #with writelock: 47 print self.name +"get value"+ value+"from queue" 48 self.q.notify()#inform producer 49 self.con.release()#release the lock 50 51 52 if __name__ == "__main__": 53 print "start to run\n" 54 q = Queue.Queue(10) 55 con = threading.Condition() 56 p = Producer(q,con,"p1") 57 p.start() 58 p1 = Producer(q,con,"p2") 59 p1.start() 60 c1 = Consumer(q,con,"c1") 61 c1.start() 62 63 64 65 66 67
3.待续......
时间: 2024-10-11 08:57:34