Python的多线程有两种实现方法:

函数,线程类

1.函数

调用thread模块中的start_new_thread()函数来创建线程,以线程函数的形式告诉线程该做什么

 


  
1. # -*- coding: utf-8 -*-  
2. import thread  
3.    
4.    
5. def f(name):  
6. #定义线程函数  
7. print "this is " + name  
8.    
9.    
10. if __name__ == '__main__':  
11. "thread1",))  
12. #用start_new_thread()调用线程函数和其他参数  
13. while 1:  
14. pass



 

不过这种方法暂时没能找到其他辅助方法,连主线程等待都要用while 1这种方法解决。

2.线程类

调用threading模块,创建threading.Thread的子类来得到自定义线程类。

 



 


1. # -*- coding: utf-8 -*-  
2. import threading  
3.    
4.    
5. class Th(threading.Thread):  
6. def __init__(self, name):  
7. self)  
8. self.t_name = name  
9. #调用父类构造函数  
10.    
11. def run(self):  
12. #重写run()函数,线程默认从此函数开始执行  
13. print "This is " + self.t_name  
14.    
15. if __name__ == '__main__':  
16. "Thread_1")  
17.     thread1.start()  
18. #start()函数启动线程,自动执行run()函数


 

threading.Thread类的可继承函数:

getName() 获得线程对象名称

setName() 设置线程对象名称

join() 等待调用的线程结束后再运行之后的命令

setDaemon(bool) 阻塞模式,True:父线程不等待子线程结束,False 等待,默认为False

isDaemon() 判断子线程是否和父线程一起结束,即setDaemon()设置的值

isAlive() 判断线程是否在运行

实例

 



 

1. import threading  
2. import time  
3.    
4.    
5. class Th(threading.Thread):  
6. def __init__(self, thread_name):  
7. self)  
8. self.setName(thread_name)  
9.    
10. def run(self):  
11. print "This is thread " + self.getName()  
12. for i in range(5):  
13. 1)  
14. print str(i)  
15. print self.getName() + "is over"



join()阻塞等待

 



 



1. if __name__ == '__main__':  
2. "T1 ")  
3.     thread1.start()  
4. #thread1.join()  
5. print "main thread is over"



 

不带thread1.join(),得到如下结果:

This is thread T1 

main thread is over

0

1

2

T1 is over

不等待thread1完成,执行之后语句。

 

加了thread1.join(),得到如下结果:

This is thread T1

0

1

2

T1 is over

main thread is over

阻塞等待thread1结束,才执行下面语句

主线程等待

 



 

1. if __name__ == '__main__':  
2. "T1 ")  
3. True)  
4. #要在线程执行之前就设置这个量  
5.     thread1.start()  
6. print "main thread is over"


 

报错:Exception in thread T1  (most likely raised during interpreter shutdown):

也就是主线程不等待子线程就结束了。

多个子线程

 



 


1. if __name__ == '__main__':  
2. for i in range(3):  
3.         t = Th(str(i))  
4.         t.start()  
5. print "main thread is over"


 

这里的t可同时处理多个线程,即t为线程句柄,重新赋值不影响线程。

这里奇怪的是,运行t.run()时,不会再执行其他线程。虽不明,还是用start()吧。暂且理解为start()是非阻塞并行的,而run是阻塞的。

线程锁

threading提供线程锁,可以实现线程同步。

 


 

1. import threading  
2. import time  
3.    
4.    
5. class Th(threading.Thread):  
6. def __init__(self, thread_name):  
7. self)  
8. self.setName(thread_name)  
9.    
10. def run(self):  
11.         threadLock.acquire()  
12. #获得锁之后再运行  
13. print "This is thread " + self.getName()  
14. for i in range(3):  
15. 1)  
16. print str(i)  
17. print self.getName() + " is over"  
18.         threadLock.release()  
19. #释放锁  
20.    
21.    
22. if __name__ == '__main__':  
23.     threadLock = threading.Lock()  
24. #设置全局锁  
25. 'Thread_1')  
26. 'Thread_2')  
27.     thread1.start()  
28.     thread2.start()


 

得到结果:

This is thread Thread_1
0
1
2
Thread_1 is over
This is thread Thread_2
0
1
2
Thread_2 is over