Python多线程Threading、子线程与守护线程实例详解


Posted in Python onMarch 24, 2020

本文实例讲述了Python多线程Threading、子线程与守护线程。分享给大家供大家参考,具体如下:

线程与进程:

  • 线程对于进程来说,就好似工厂里的工人,分配资源是分配到工厂,工人再去处理。
  • 线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
  • 在单个程序中同时运行多个线程完成不同的工作,称为多线程
  • 对于IO密集型的程序来说,多线程可以利用读IO的时间去做其他事【IO并不占用CPU,这就好像A买个一份外卖,他只需要等着送过来然后敲A家的门就行了】;
  • 而对于CPU密集型的程序来说,多线程的效率就不是很高了【CPU由于要计算,切换之间要恢复之前的现场消耗相对较大,比如我同时做几份作业,一份作业做十分钟,假如十分钟做不完一份作业,那么我后面再回头做的时候,我就要好好想想刚才做到哪,刚才想到哪

    补充:IO需要CPU吗?知乎:https://www.zhihu.com/question/27734728

    Python多线程Threading、子线程与守护线程实例详解


  • 线程Threading:

    python中多线程需要使用threading模块

    线程的创建与运行:

    1.直接调用threading的Thread类:

    线程的创建:线程对象=thread.Thread(target=函数名,args=(参数))【补充,由于args是一个元组,单个参数时要加“,”】

    线程的启动:线程对象.start(),调用start(),那么线程对象会自动去调用thread.Thread中的run()

    让主线程等待其余线程结束:线程对象.join(),加了join之后,相当于阻塞了主线程,主线程只有当join的线程结束后才会向下执行

    import threading,time
    
    def run(n):
     time.sleep(1)
     print("task ",n)
    
    t1=threading.Thread(target=run,args=("t1",))
    t2 = threading.Thread(target=run,args=("t2",))
    
    start_time=time.time()#开始时间
    t1.start()
    t2.start()
    ##因为是独立线程,如果想要主线程等待其他线程运行完毕,需要使用join
    t1.join()
    t2.join()
    spend_time=time.time()-start_time
    print(spend_time)##1.0多,说明是并行的结果

    附加说明--join是阻塞等待:

    import threading,time
    
    class MyTread(threading.Thread):
     def __init__(self,name):
      super(MyTread,self).__init__()#调用父类的__init__()
      self.name=name
     def run(self):#重写方法,按自己的要求去写
      time.sleep(1)
      print("run in task",self.name,threading.current_thread(),threading.active_count())
    
    t1=MyTread("t1")
    t2=MyTread("t2")
    start_time=time.time()
    t1.start()
    t2.start()
    
    t1.join()
    t2.join()
    time.sleep(1)###主线程等待其余线程结束
    print(time.time()-start_time)
    #结果是2.0多,证明是join是相当于阻塞了主线程的执行,只有当线程结束后才会向下执行

    2.继承threading的Thread类:

    继承threading的Thread类的类要主要做两件事:

    1.如果不做自定义变量的初始化,那么可以直接使用继承的父类的__init__(),如果需要做自定义变量的初始化,则需要先调用父类的__init__()【否则需要自己填写线程初始化相关的参数】

    2.重写run,虽然继承了父类的run,但实际上如果不重写,那么我们继承threading的Thread类又有什么意义呢?为什么不直接调用threading的Thread类

  • import threading,time
    
    class MyTread(threading.Thread):
     def __init__(self,name):
      super(MyTread,self).__init__()#调用父类的__init__()
      self.name=name
     def run(self):#重写方法,按自己的要求去写
      time.sleep(1)
      print("run in task",self.name,threading.current_thread(),threading.active_count())
    
    t1=MyTread("t1")
    t2=MyTread("t2")
    start_time=time.time()
    t1.start()
    t2.start()
    ###主线程等待其余线程结束
    t1.join()
    t2.join()
    print(time.time()-start_time)#结果是1.0多,证明是并行的

    子线程:

    • 由一个线程启动的线程可以成为它的子线程,A启动B,B是A的子线程,A是B的父线程

    线程的几个常用函数:

    • threading.current_thread():
    返回当前正在运行的线程对象
    
      
    • threading.active_count():
    返回当前进程中的存活的线程对象数

    Python多线程Threading、子线程与守护线程实例详解

    • 线程对象.isAlive()方法判断线程是否存活

    Python多线程Threading、子线程与守护线程实例详解

    • getName(): 返回线程名。
    • setName(): 设置线程名。

    Python多线程Threading、子线程与守护线程实例详解

  • get_ident():获取当前线程ID。


    守护线程:

    • 守护线程是起到辅助功能的,就好像魔法师放禁咒总要骑士保护一样【魔法师只需要关系自己的任务,保护他的任务交给守护者】
    • 而守护线程与主线程的关系呢,就好像备胎跟女神,去买东西的话,备胎要一直在外面等女神【守护线程运行结束就狗带,但不影响主进程结束,由主线程决定运行时间】,女神不需要等待备胎【主线程结束,守护线程也要结束,不管自身任务是否完成】
    • 与join的区别:join是阻塞等待,守护线程是并行的等待
    • 设置守护线程:线程对象.setDaemon(True)【注意!!!!!设置守护线程必须要在start()前面,不然会报错】

    下面的代码显示了主线程并不会等待其守护线程结束:

    import threading,time
    
    class MyTread(threading.Thread):
    
     def __init__(self,name):
      super(MyTread,self).__init__()
      self.name=name
     def run(self):
      print("守护线程已经启动",self.name)
      time.sleep(1)
      print("run in task",self.name,threading.current_thread(),threading.active_count())
    
    t1=MyTread("t1")
    t1.setDaemon(True)
    t2=MyTread("t2")
    t2.setDaemon(True)
    start_time=time.time()#开始时间
    t1.start()
    t2.start()
    
    spend_time=time.time()-start_time
    print(spend_time)##0.0多,而且三个线程都执行完毕了,说明这个是并行的等待

    Python多线程Threading、子线程与守护线程实例详解

    让主线程sleep一下,显示一下如果主线程要等待守护线程,那么是并行的等待:

    import threading,time
    
    class MyTread(threading.Thread):
    
     def __init__(self,name):
      super(MyTread,self).__init__()
      self.name=name
     def run(self):
      print("守护线程已经启动",self.name)
      time.sleep(1)
      print("run in task",self.name,threading.current_thread(),threading.active_count())
    
    t1=MyTread("t1")
    t1.setDaemon(True)
    t2=MyTread("t2")
    t2.setDaemon(True)
    start_time=time.time()#开始时间
    t1.start()
    t2.start()
    time.sleep(2)
    spend_time=time.time()-start_time
    print(spend_time)##2.0多,而且三个线程都执行完毕了,说明这个是并行的等待

    Python多线程Threading、子线程与守护线程实例详解

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 文件与目录操作
Dec 24 Python
Python列表推导式的使用方法
Nov 21 Python
9种python web 程序的部署方式小结
Jun 30 Python
Python操作SQLite简明教程
Jul 10 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
python实现贪吃蛇小游戏
Mar 21 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
Django保护敏感信息的方法示例
May 09 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 #Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 #Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 #Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 #Python
Python+Appium实现自动化测试的使用步骤
Mar 24 #Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 #Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 #Python
You might like
留言板翻页的实现详解
2006/10/09 PHP
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP7 list() 函数修改
2021/03/09 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
学习YUI.Ext 第三天
2007/03/10 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python实现通讯录功能
2018/02/22 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
开工庆典邀请函范文
2014/01/16 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
驾驶员安全责任书
2014/07/22 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL