Python提供了多个模块来支持多线程编程,包括thread、threading和queue模块等。
thread模块提供了基本的线程和锁定支持;而threading模块提供了更高级别、功能更全面的线程管理。
queue模块,用户可以创建一个队列数据结构,用于在多线程之间进行共享。

核心提示:避免使用thread模块
推荐使用更高级别的threading模块,原因如下:
1.threading模块更加先进,有更好的线程支持,并且thread模块中的一些属性会和threading模块有冲突;
2.低级别的thread模块拥有的同步原语很少(实际上只有一个),而threading模块则有很多;
3.thread模块对于进程何时退出没有控制,当主线程结束时,所有其他线程也都强制结束,不会发出警告或者进行适当的清理;
4.threading模块至少能确保重要的子线程在进程退出去前结束。
5.thread模块不支持守护线程这个概念(thread:当主线程退出时,所有子线程都将终止,不管它们是否仍在工作)

一.避免使用thread模块,但要了解其基本用法

import thread
from time import sleep,ctime,strftimeloops = [4,2]def loop(nloop,nsec,lock):print 'start loop',nloop,'at:',strftime('%Y-%m-%d %H:%M:%S') sleep(nsec)print 'loop',nloop,'done,at:',strftime('%Y-%m-%d %H:%M:%S')lock.release() #释放锁
def main():print 'starting at:',strftime('%Y-%m-%d %H:%M:%S')locks = []nloops = range(len(loops)) #[0, 1]for i in nloops:lock = thread.allocate_lock() #获取LockType锁对象lock.acquire() #取得每个锁(相当于"把锁锁上")locks.append(lock) #一旦锁被锁上,就可以把它添加到锁列表locks中了#print locksfor i in nloops: #派生线程#每个线程会调用loop()函数,并传递循环号、睡眠时间以及用于该线程的锁thread.start_new_thread(loop,(i,loops[i],locks[i]))sleep(1)for i in nloops:while locks[i].locked(): #暂停主线程,等待,直到所有锁都被释放之后才会继续执行passprint 'all done at:',strftime('%Y-%m-%d %H:%M:%S')if __name__ == '__main__':main()

二.推荐使用更高级别的threading模块,函数式编程法  

import threading
#threading模块的Thread类有一个join()方法,可以让主线程等待所有线程执行完毕from time import sleep,strftimeloops = [4,2,2]def loop(nloop,nsec):print 'start loop',nloop,'at:',strftime('%Y-%m-%d %H:%M:%S') sleep(nsec)print 'loop',nloop,'done,at:',strftime('%Y-%m-%d %H:%M:%S')
def main():print 'starting at:',strftime('%Y-%m-%d %H:%M:%S')threads = []nloops = range(len(loops)) #[0, 1]for i in nloops:#实例化Thread(调用Thread()和之前调用thread.start_new_thread()最大区别在于新线程不会立即开始执行t = threading.Thread(target=loop,args=(i,loops[i])) #这是个非常有用的同步功能threads.append(t)for i in nloops: #启动线程#当所有线程都分配完成后,通过调用每个线程的start()方法来让它们执行,而不是在这之前就会执行threads[i].start()for i in nloops: #为每个线程调用join()方法,join()方法将等待线程结束,或在提供了超时时间的情况下,达到超时时间。threads[i].join() #join()方法只有在你需要等待线程完成的时候才有用#join()方法其实根本不需要调用,一旦线程启动,它们就会一直执行,直到给定的函数完成后退出。print 'all done at:',strftime('%Y-%m-%d %H:%M:%S')print loop.__name__if __name__ == '__main__':main()

三.threading模块的面向对象编程法,使用可调用的类 

import threading
from time import sleep,strftimeloops = [4,2]class ThreadFunc(object): #添加ThreadFunc类def __init__(self,func,args,name = ''): #构造方法设定函数自身,函数参数及函数名的字符串self.name = nameself.func = funcself.args = argsdef __call__(self): #__call__特殊方法直接调用self.func(*self.args)def loop(nloop,nsec):print 'start loop',nloop,'at:',strftime('%Y-%m-%d %H:%M:%S')sleep(nsec)print 'loop',nloop,'done at:',strftime('%Y-%m-%d %H:%M:%S')def main():print 'starting at:',strftime('%Y-%m-%d %H:%M:%S')threads = []nloops = range(len(loops))for i in nloops: #实例化Thread类对象t = threading.Thread(target=ThreadFunc(loop,(i,loops[i]),loop.__name__)) #分配线程threads.append(t) for i in nloops:threads[i].start() #真正通过start()方法才启动线程for i in nloops:threads[i].join() #等待线程完成print 'all done at:',strftime('%Y-%m-%d %H:%M:%S')   if __name__ == '__main__':main()

四.threading模块面向对象扩展,派生Thread的子类,并创建子类的实例 

'''
import threading
from time import sleep,strftimeloops = [4,2]class MyThread(threading.Thread):def __init__(self,func,args,name=''):threading.Thread.__init__(self) #MyThread子类的构造方法必须先调用基类(即父类)的构造方法self.name = nameself.func = func        self.args = argsdef run(self): #之前的特殊方法__call__在这里必须要写成run()self.func(*self.args)def loop(nloop,nsec):print 'start loop',nloop,'at:',strftime('%Y-%m-%d %H:%M:%S')sleep(nsec)print 'loop',nloop,'done at:',strftime('%Y-%m-%d %H:%M:%S')def main():print 'starting at:',strftime('%Y-%m-%d %H:%M:%S')threads = []nloops = range(len(loops)) #print nloopsfor i in nloops:t = MyThread(loop,(i,loops[i]),loop.__name__)threads.append(t)for i in nloops:threads[i].start()for i in nloops:threads[i].join()print 'all done at:',strftime('%Y-%m-%d %H:%M:%S')if __name__ == '__main__':main()'''#Thread子类MyThread
#将上面的代码独立作为一个模块,把结果保存在实例属性self.res中,并创建一个新的方法getResult()来获取这个值import threading
from time import strftimeclass MyThread(threading.Thread):def __init__(self,func,args,name=''):threading.Thread.__init__(self)self.name = nameself.func = funcself.args = argsdef getResult(self):return self.resdef run(self):print 'starting',self.name,'at:',strftime('%Y-%m-%d %H:%M:%S')self.res = self.func(*self.args)print self.name,'finished at:',strftime('%Y-%m-%d %H:%M:%S')

  

参考资料《python核心编程》(第3版) 

 

转载于:https://www.cnblogs.com/binguo2008/p/7352144.html

Python学习心得(七) 深入理解threading多线程模块相关推荐

  1. python学习心得(一)

    python学习心得 人生苦短,我用python.看到python有那么多开放的库,短短几行代码就能搞定一个项目,有点面向对象的经验确实很容易学习. 1. 语法基础 2. 项目练习 3. 项目过程中的 ...

  2. python——Tkinter图形化界面及threading多线程

    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...

  3. 大一上学期Python学习心得体会

    Python学习心得体会 经过了大一上学期的Python学习,我已经逐渐摸索到了Python的一些学习方法,学习Python,就像学习其他编程语言或者是学习一门外语一样 ,我们应该从Python的基础 ...

  4. BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) author: wolfenstein (NeverSayNever) 上次我们分析了Tracker类初始化的 ...

  5. Python学习第七课-元组字典集合

    Python学习第七课-元组&字典&集合 一.元组 1.1元组简介 1.2元组的拆包 1.3字符串拆包 1.4列表的拆包 1.5拆包练习 二.字典的简介 2.1介绍 2.2操作 三.字 ...

  6. Python学习心得第一周-01

    一 编程与编程语言 python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的: #计算机的发明,是为了用机器取代/解放人力,而 ...

  7. python心得1000字-python学习心得(一)

    ~~缘 起~~ 2017年11月,一群编程零基础的小伙伴们成立了Python学习小组,12名学员从此夜以继日地奔赴学习的征程.一个月过去了,从在屏幕上用最简单的语句打印出"Hello, Py ...

  8. 学python心得体会1000字-Python学习心得体会总结,不要采坑

    大家要持续关注哦,不定时更新Python知识哦! Python 作为一个近年备受好评的语言,它的一些优点让人无法忽视.Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.它的 ...

  9. python学习心得和体会

    这是我第一次的博客发文,来记录我初学python的心得体会. python相对于其他计算机语言来说入门简单,且发展前景良好.正所谓:人生苦短,我选python. python与C语言作一些比较: 1: ...

最新文章

  1. 隔年增长的题_行测资料分析:一起聊聊隔年增长
  2. android shape.xml 文件使用
  3. 动态绘制圆环和扇形的源代码
  4. java提高篇(十六)-----异常(一)
  5. 打破传统降噪技术 看网易云信在语音降噪的实践应用
  6. SAP Spartacus B2B Org Unit树状结构的加载机制
  7. LINQ to SQL自定义映射表关系(1:N or 1:1)
  8. 古代的酒到底多少度,为何古人动不动喝好几坛都不会醉呢?
  9. java项目打成war包,使用ide打包部署在tomcat中
  10. 冻结html表格标题列,jQuery实现冻结表头的方法
  11. vs2017可以写python_『vs python 使用教程』怎么用VS2017写一个最简单的Python程序,比如hello world?...
  12. SOA架构设计的案例分析
  13. 编译原理的first、follow、select
  14. Linux系统备份与还原
  15. 图论及其应用 2018年期末考试 答案总结
  16. 硬盘的IDE、AHCI和NVMe模式区别
  17. Android GRO相关
  18. 鲁棒与最优控制(一)
  19. Leaving...Hard resetting via RTS pin...
  20. Shiro的认证原理(Subject#login的背后故事)

热门文章

  1. html标记语言 --超链接
  2. Python递归、反射、2分查找、冒泡排序
  3. [转]GeoHash核心原理解析
  4. C# partial 说明
  5. 结合CmakeList来更好地理解windows下的动态库和静态库
  6. 基础算法 -- 贪心算法
  7. 考研c语言复试常问问题,2018考研复试常问的十个问题及回答指导
  8. gc android,Android GC Log解读
  9. 计算机软件技术信息安全哪个好,国内哪个大学的计算机安全专业最好?
  10. python 生成nc文件_Python生成器处理大文本文件的代码