博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Python]多线程入门
阅读量:5917 次
发布时间:2019-06-19

本文共 2740 字,大约阅读时间需要 9 分钟。

原文:http://blog.csdn.net/ice110956/article/details/28421807

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

函数,线程类

1.函数

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

 

[python]   
 
 
  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.     thread.start_new_thread(f, ("thread1",))  
  12.     #用start_new_thread()调用线程函数和其他参数  
  13.     while 1:  
  14.         pass  

 

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

2.线程类

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

 

[python]   
 
 
  1. # -*- coding: utf-8 -*-  
  2. import threading  
  3.    
  4.    
  5. class Th(threading.Thread):  
  6.     def __init__(self, name):  
  7.         threading.Thread.__init__(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.     thread1 = Th("Thread_1")  
  17.     thread1.start()  
  18.     #start()函数启动线程,自动执行run()函数  

 

threading.Thread类的可继承函数:

getName() 获得线程对象名称

setName() 设置线程对象名称

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

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

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

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

实例

 

[python]   
 
 
  1. import threading  
  2. import time  
  3.    
  4.    
  5. class Th(threading.Thread):  
  6.     def __init__(self, thread_name):  
  7.         threading.Thread.__init__(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.             time.sleep(1)  
  14.             print str(i)  
  15.         print self.getName() + "is over"  

join()阻塞等待

 

[python]   
 
 
  1. if __name__ == '__main__':  
  2.     thread1 = Th("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结束,才执行下面语句

主线程等待

 

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

 

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

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

多个子线程

 

[python]   
 
 
  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提供线程锁,可以实现线程同步。

 

[python]   
 
 
  1. import threading  
  2. import time  
  3.    
  4.    
  5. class Th(threading.Thread):  
  6.     def __init__(self, thread_name):  
  7.         threading.Thread.__init__(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.             time.sleep(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.     thread1 = Th('Thread_1')  
  26.     thread2 = Th('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

 

 
 

转载于:https://www.cnblogs.com/zhizhan/p/5790322.html

你可能感兴趣的文章
刀片服务器故障一例
查看>>
第四章—使用函数
查看>>
使用 JFreeChart来创建基于web的图表
查看>>
Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置
查看>>
马哥2016全新Linux+Python高端运维班-Linux用户创建及权限管理
查看>>
699的高性价比,大神F1极速版体验一览
查看>>
开放与互联:透明工厂如何引领中国制造升级?
查看>>
Linux下添加php的zip模块
查看>>
memcache
查看>>
Percona XtraBackup备份数据库关于数据路径默认选择和show variables
查看>>
单例模式和静态方法的区别
查看>>
android 获取系统默认路径
查看>>
Highcharts API中英对照查询表
查看>>
Docker 网络管理
查看>>
repaint和reflow的相关知识
查看>>
android系统信息总结
查看>>
phantomjs处理异步加载后,获取渲染后的页面源码
查看>>
varnish 简介以及实用配置
查看>>
Python中pyc文件的用途
查看>>
eclipse调试远程Tomact
查看>>