1、守护子进程

主进程创建守护进程

  1. 其一:守护进程会在主进程代码执行结束后就终止
  2. 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to havechildren

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

我们来看一个例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from multiprocessing import Process

import os,time,random

def task():

  print('%s is running' %os.getpid())

  time.sleep(2)

  print('%s is done' %os.getpid())

  #守护进程内无法再开启子进程,否则抛出异常

  # p = Process(target=time.sleep, args=(3,))

  # p.start()

if __name__ == '__main__':

  p=Process(target=task)

  p.daemon = True #1、必须在p.start()之前

  p.start()

  print('主')

输出结果如下:

原因是:主进程程序启动执行到p子进程,由于子进程需要开辟内存空间,由于需要耗费时间,所以主进程会首先输出“主”,由于主进程执行完毕,那么守护子进程p也就被干掉了,随之主进程也就退出了

如果上面代码修改如下,加上 p.join()这一行代码

1

2

3

4

5

6

if __name__ == '__main__':

  p=Process(target=task)

  p.daemon = True #1、必须在p.start()之前

  p.start()

  p.join()

  print('主')

那么程序会输出如下:

14732 is running

14732 is done

join以前也分析过,是起到阻塞作用,子进程执行完毕,才执行主进程,所以加上join

1、执行到join,是起到阻塞作用,就会执行子进程,然后执行完毕,在执行主进程

2、也可以这样理解,执行到join,由于主进程print(“主”)没有执行完,所以守护进程不会被干掉,继续执行

1、守护子进程、非守护子进程并存

在上面的例子是子进程只有一个守护进程,在主进程执行完毕,守护子进程就会被干掉 ,我们在来看一个,子进程既有守护子进程,又包含非守护子进程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

from multiprocessing import Process

from threading import Thread

import time,os

def foo():

  print(123)

  time.sleep(1)

  print("end123")

def bar():

  print(456)

  time.sleep(3)

  print("end456")

if __name__ == '__main__':

  p1=Process(target=foo)

  p2 = Process(target=bar)

  p1.daemon=True

  p1.start()

  p2.start()

  print("main-------")

输出如下:

main-------
456
end456

原因如下:由于p1,p2都是子进程,需要开辟内存空间,需要耗费时间,所以会优先输出主进程“main”,由于p1是守护子进程,p2是非守护子进程,当主进程执行完毕(注意之类主进程还没有退出,因为还有p2非守护进程),p1守护进程也就退了,但是还有一个p2非守护进程,所以p2会执行自己的代码任务,当p2执行完毕,那么主进程也就退出了,进而整个程序就退出了

守护线程

守护子线程

无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

需要强调的是:运行完毕并非终止运行

1.对主进程来说,运行完毕指的是主进程代码运行完毕

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

详细解释:

1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,

2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

我们先来看一个例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from multiprocessing import Process

from threading import Thread

import os,time,random

def task():

  # t=Thread(target=time.sleep,args=(3,))

  # t.start()

  print('%s is running' %os.getpid())

  time.sleep(2)

  print('%s is done' %os.getpid())

if __name__ == '__main__':

  t=Thread(target=task)

  t.daemon = True

  t.start()

  print('主')

输出如下:

13368 is running

原因是:

在执行到守护子线程t,由于主线程子线程通用一块内存,所以不存在不同进程创建各自空间,所以就先输出子进程的执行任务代码,所以输出print(‘%s is running' %os.getpid()),由于time.sleep(2),所以就会执行主线程“main”,然后主线程执行完毕,那么即使2秒过后,由于主线程执行完毕,那么子守护线程也就退出了,所以 print(‘%s is done' %os.getpid())就不会执行了

守护子线程非守护子进程并存

我们解析来看一个守护子线程非守护子进程并存的例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

from threading import Thread

import time

def foo():

  print(123)

  time.sleep(1)

  print("end123")

def bar():

  print(456)

  time.sleep(3)

  print("end456")

if __name__ == '__main__':

  t1=Thread(target=foo)

  t2 = Thread(target=bar)

  t1.daemon=True

  t2.start()

  t1.start()

  print("main-------")

输出如下:

456
123
main-------

end123

end456

原因是:

t1是守护子线程,t2非守护子线程,跟主线程使用一块内存,所以会输出t1,t1子线程的任务代码,所以执行456,123由于t1,t2都有睡眠时间,所以执行主线程代码,然后对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕,所以会执行t1,t2睡眠后的任务代码,然后程序退出。

我们会问为什么t1守护子线程,也会执行sleep后的代码,不是说主线程代码执行完毕,守护线程就被干掉了吗?这里要注意是对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕,当时t2还没执行完毕

最后根据这篇文章谈谈我对主线程和子线程的理解

主线程就是程序本身执行所开启的线程,子线程就是在程序中利用语句建立的线程。

参考自https://www.jb51.net/article/139521.htm

python守护线程相关推荐

  1. Python 守护线程

    Python 守护线程 如果你设置一个线程为守护线程,,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出.  如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程 ...

  2. python守护线程_Python守护线程用法实例

    本文实例讲述了Python守护线程用法.分享给大家供大家参考,具体如下: 如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出.如果你的主线程在退出的时 ...

  3. 3 - 线程 - Windows 10 - Python - 守护线程 / 后台线程 / 精灵线程

    目录 一.守护线程 / 后台线程 / 精灵线程 二.创建精灵线程的方法 参考链接 测试环境: 操作系统: Window 10 工具:Pycharm Python: 3.7 一.守护线程 / 后台线程 ...

  4. python 守护线程 join_Python多线程threading join和守护线程setDeamon原理详解

    同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作:cpu执行的都是线程,默认程序会开一个主线程:进程是程序以及和程序相关资源的集合:某些场景下我们可以使用多线程来达到提高程 ...

  5. python守护线程t.setDaemon(True)

    守护线程是守护主线程  t.setDaemon(True),调用函数里面存在等待时间时,只要设置了守护线程,函数中等待时间下面的代码都不会再执行 转载于:https://www.cnblogs.com ...

  6. python守护线程错误 退出子线程_请问用python里threading和queue模块来写多线程程序,子线程是如何结束的?...

    import queue import threading class Consumer(threading.Thread): def __init__(self, queue): threading ...

  7. python守护线程_Python之守护线程与锁

    # 守护线程随着子线程结束而结束,与守护进程不一样--守护进程随着主进程代码执行完毕而结束 # from threading import Thread # import time # # def f ...

  8. python开发线程:线程守护线程全局解释器锁

    From: https://www.cnblogs.com/jokerbj/p/7460260.html 一 threading模块介绍 multiprocess模块的完全模仿了threading模块 ...

  9. python开两个守护线程_python 守护线程

    守护线程 如果python线程是守护线程,那么以为着这个线程是"不重要"的,"不重要"意味着如果他的父进程结束了但该守护线程没有运行完,守护进程就会被强制结束. ...

最新文章

  1. 创维广电服务器无线,创维电视连有线网、连无线网详细图文教程
  2. 定制化WordPress后台的6个技巧
  3. eplan如何导入access_EPLAN如何助力汽车行业的智能制造转型?
  4. 谷歌大脑2017总结(Jeff Dean执笔,干货满满,值得收藏)
  5. hdfs开机启动流程
  6. Atitit 语音识别的技术原理
  7. 单片机音频谱曲软件_单片机谱曲软件怎么弄 51单片机蜂鸣器电子琴程序
  8. 文末彩蛋 | 这个 Request URL 长得好不一样
  9. CentOS7安装RabbitMQ(解决guest用户无法登录问题)
  10. calipso是什么意思_library是什么意思_library的翻译_音标_读音_用法_例句_爱词霸在线词典...
  11. 全球主要语言缩写对照
  12. vue中的表单数据提交
  13. 计算机维修工实操,计算机维修工(三级)操作技能练习题.pdf
  14. DeadException
  15. 华为G610(Android 4.2)永久关闭键盘灯的方法
  16. 如何在iPhone和iPad上的Safari中在后台打开链接
  17. 《大话数据结构》笔记——第8章 查找(四)
  18. python把文本转换为html_Python基础教程——把文本转为HTML格式
  19. 空间表示与变换—— 台湾交通大学机器人学公开课(二)
  20. Java中国个人税计算方法

热门文章

  1. <load-on-startup>1</load-on-startup>的作用
  2. keil html转换工具,网页转换工具FCARM和makefsfile的使用简介
  3. cairo填充_Cairo 图形指南 (5) —— 形状与填充
  4. 科研工作者结合实验与计算机模拟,理论物理前沿重点实验室
  5. linux文件名过长无法删除,不能删除文件,出现“源文件名长度大于系统支持的长度...
  6. python查看电脑配置_怎么查看电脑配置(教你如何查看电脑配置信息和型号)
  7. python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法
  8. 程序win10_win10该文件没有与之关联的程序来执行操作
  9. 阻塞式和非阻塞式udp传输_NIO非阻塞网络编程三大核心理念
  10. 基于Java+SpringBoot+vue+node.js等疫情网课管理系统详细设计和实现