做完工作这个进程就应该被销毁

单线程情况:

一个进程 ,默认有一个主线程 ,这个主线程执行完代码后 ,就应该自动销毁。然后进程也销毁。

多线程情况:

主线程代表进程结束

一个进程可以开多个线程,默认开启进程 ,首先开一个主线程 ,然后开子线程 ,主线程代码执行完毕后 ,也要等所有子线程 ,执行完毕后 ,再销毁 ,然后到进程销毁。

守护进程 要等主进程挂了后 守护进程才挂

  1. 1、对主进程来说,运行完毕指的是主进程代码运行完毕
  2.  
  3. 2、对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕

主进程代码执行完后 ,守护进程就挂了

  1. 1、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
  2.  
  3. 2、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,
    而进程必须保证非守护线程都运行完毕后才能结束。

守护线程守护着对象是主线程

守护线程盯着主线程 主线程一挂 守护线程就挂

总结 守护线程 ,就是等到进程内所有非守护线程运行完毕后 ,守护线程才销毁。

没有非守护线程 只有一个主线程情况下

开启守护线程方法一

t.setdaemon(True)

  1. from threading import Thread
  2. import time
  3.  
  4. def sayhi(name):
  5. time.sleep(2)
  6. print('%s say hello' %name)
  7.  
  8. if __name__ == '__main__':
  9. t = Thread(target=sayhi,args=('子线程',))
  10. t.setDaemon(True) # 必须在t.start()之前设置
  11. t.start()
  12.  
  13. print('主线程')
  14. print(t.is_alive())
  15.  
  16. '''
  17. 主线程
  18. True
  19. '''

开启守护线程方法二

t.daemon = True

  1. from threading import Thread
  2. import time
  3.  
  4. def sayhi(name):
  5. time.sleep(2)
  6. print('%s say hello' %name)
  7.  
  8. if __name__ == '__main__':
  9. t = Thread(target=sayhi,args=('子线程',))
  10. t.daemon = True # 必须在t.start()之前设置
  11. t.start()
  12.  
  13. print('主线程')
  14. print(t.is_alive())
  15.  
  16. '''
  17. 主线程
  18. True
  19. '''

子线程没有执行sayhi函数的代码,代表子线程已经死了

有非守护线程情况下

  1. from threading import Thread
  2. import time
  3.  
  4. def foo():
  5. print(123)
  6. time.sleep(1)
  7. print("end123")
  8.  
  9. def bar():
  10. print(456)
  11. time.sleep(3)
  12. print("end456")
  13.  
  14. if __name__ == '__main__':
  15. t1 = Thread(target=foo)
  16. t2 = Thread(target=bar)
  17.  
  18. t1.daemon = True
  19. t1.start()
  20. t2.start()
  21. print("main-------")
  22. # 非守护线程是t2 主线程 t1是守护线程
  23. # 守护线程 等所有非守护线程执行完毕后 再销毁
  24.  
  25. '''
  26. 首先t1.start,t2.start 开启线程都是很快执行
  27. 所以打印123 然后t1 time.sleep ,打印t2的456 ,t2也time.sleep了,
  28. 然后打印主的消息 main
  29.  
  30. 这种情况是 守护线程t1 在t2 执行最后一行代码前就死了 因为 t2 的time.sleep 3秒
  31. t1 1秒 时间早就过了 所以t1先执行最后一行代码
  32. '''
  33.  
  34. '''
  35. 123
  36. 456
  37. main-------
  38. end123
  39. end456
  40. '''

python 并发编程 多线程 守护线程的更多相关文章

  1. 并发编程~~~多线程~~~守护线程, 互斥锁, 死锁现象与递归锁, 信号量 (Semaphore), GIL全局解释器锁

    一 守护线程 from threading import Thread import time def foo(): print(123) time.sleep(1) print('end123') ...

  2. python 并发编程 多线程 开启线程的两种方式

    一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 二 开启线程的两种方式 第一种 每造一个进程,默认有一个线程,就是 ...

  3. python 并发编程 多线程 目录

    线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...

  4. python并发编程&多线程(二)

    前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...

  5. python并发编程&多线程(一)

    本篇理论居多,实际操作见:  python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...

  6. Python并发编程——多线程与协程

    Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...

  7. python并发编程——多线程

    编程的乐趣在于让程序越来越快,这里将给大家介绍一个种加快程序运行的的编程方式--多线程   1 著名的全局解释锁(GIL) 说起python并发编程,就不得不说著名的全局解释锁(GIL)了.有兴趣的同 ...

  8. python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)

    9.94 守护线程与守护进程的区别 1.对主进程来说,运行完毕指的是主进程代码运行完毕2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕​详细解释:1.主 ...

  9. Python 并发编程(一)之线程

    常用用法 t.is_alive() Python中线程会在一个单独的系统级别线程中执行(比如一个POSIX线程或者一个Windows线程)这些线程将由操作系统来全权管理.线程一旦启动,将独立执行直到目 ...

随机推荐

  1. 快速排序c代码

    //快速排序,通过测试 #include "stdio.h" void quickSort(int* data,int len){ ) return; ; ; ]; while(s ...

  2. UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  3. JavaScript 正则表达式——定义,目的,特点,语法,字符串方法,search() ,replace() ,test(),exec()

    ㈠什么是正则表达式? ⑴正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.    正则表达式通常被用来检 ...

  4. socket 异步 发送 接收 数据

    Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / ...

  5. FFT用于高效大数乘法(当模板用)

    转载来源:https://blog.csdn.net/zj_whu/article/details/72954766 #include <cstdio> #include <cmat ...

  6. Springboot 使用mybatis

    Springboot 使用mybatis 依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. 动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

  8. postman教学视频百度网盘转载分享

    百度云盘教学视频分享:https://pan.baidu.com/s/1r_e08FOkvQBZcC5-vU5M4w postman官网及下载地址:https://www.getpostman.com ...

  9. Hadoop监控指标项

    配置 修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh # 在配置namenode和datanode时都会有用到JMX_OPTS的代码,是为了减少重复提取出的公共代码 e ...

  10. kali修改更新源及更新

    进入源文件进行修改 leafpad /etc/apt/sources.list (其实系统本身就自带了更新源,去掉其注释也是可以的,现在官方源的下载速度也还ok,下面的三选一亦可) #kali官方源 ...