主线程(进程)退出后,主线程创建的守护线程也会退出吗?

通过下面的代码测试:

Demo1: 进程创建普通线程

#!/usr/bin/python3
# FileName: daemonThread.py
# Author: lxw
# Date: 2016-02-25 import threading
import time def show(num):
time.sleep(3)
print("In show(): {0}".format(num))
with open("/home/lxw/Documents/NOTE", "w") as f:
f.write("hello") def main():
th = threading.Thread(target=show, args=(1,))
#th.setDaemon(True)
th.start()
print("main() over. Program exit!") if __name__ == '__main__':
main()
else:
print("Being imported as a module.")

运行结果:

lxw Documents$ python3 daemonThread.py
main() over. Program exit!
In show():
lxw Documents$

"The entire Python program exits when no alive non-daemon threads are left".

只有当前进程的所有非守护线程 全部结束后,当前进程才能结束。

Demo2: 进程创建守护线程

#!/usr/bin/python3
# FileName: daemonThread.py
# Author: lxw
# Date: 2016-02-25 import threading
import time def show(num):
time.sleep(3)
print("In show(): {0}".format(num))
with open("/home/lxw/Documents/NOTE", "w") as f:
f.write("hello") def main():
th = threading.Thread(target=show, args=(1,))
th.setDaemon(True)
th.start()
print("main() over. Program exit!") if __name__ == '__main__':
main()
else:
print("Being imported as a module.")

运行结果:

lxw Documents$ ls
daemonThread.py NOTE ThreadPool_Python
lxw Documents$ rm NOTE
lxw Documents$ ls
daemonThread.py ThreadPool_Python

lxw Documents$ python3 daemonThread.py
main() over. Program exit!
lxw Documents$ ls
daemonThread.py ThreadPool_Python

从运行结果我们可以看到,当前进程的守护线程 并没有结束,但当前进程仍然可以退出。并且当前进程结束后,该进程的守护线程也会结束,不会继续运行。

也就是说进程退出并不考虑守护线程,只考虑非守护线程。

通过这两段代码的验证,我们可以得出本文标题的答案:进程结束后,该进程的守护线程也会结束,不会继续运行。

Reference:

1. [Java基础] java的守护线程与非守护线程 虽然这篇文章讲的是Java的,但和Python也是通用的。
守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:public final void setDaemon(boolean on) ;但是有几点需要注意:
1). thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个 IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。(备注:这点与守护进程有着明显的区别, 守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)
2). 在Daemon线程中产生的新线程也是Daemon的。(这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是“父进程挂掉,init收养,然后 文件0,1,2都是/dev/null,当前目录到/”)

2. 这篇博文的评论

Does Daemon Thread Exit with Main Thread?的更多相关文章

  1. Sub Thread to update main Thread (UI) 2

    Sub Thread to update main Thread (UI)  2 Handler.post(somethread); Handler.sendMessage("Msg&quo ...

  2. Sub Thread to update main Thread (UI)

    Sub Thread to update main Thread (UI) main Thread :   A  has Hander.HandleMessage() to process the & ...

  3. tensorflow_目标识别object_detection_api,RuntimeError: main thread is not in main loop,fig = plt.figure(frameon=False)_tkinter.TclError: no display name and no $DISPLAY environment variable

    最近在使用目标识别api,但是报错了: File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/script_o ...

  4. Why NSAttributedString import html must be on main thread?

    The HTML importer should not be called from a background thread (that is, the options dictionary inc ...

  5. 13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)

    今天花费了一天的时间来解决这个bug. 这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决. 还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出:那 ...

  6. reloadData should be in main thread

    reloadData should be called in main thread, so if you call it in work thread, you should call it as ...

  7. main thread starting…

    例的结果,下面的: main thread starting- Thrad 2 staring- Thrad 2 end- Thrad 4 staring- Thrad 4 end- Thrad 1 ...

  8. APP崩溃提示:This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.

    崩溃输出日志 2017-08-29 14:53:47.332368+0800 HuiDaiKe[2373:1135604] This application is modifying the auto ...

  9. Ajax.html:35 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org

    AJAX的容易错误的地方 Ajax.html:35 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated ...

随机推荐

  1. gsoap 学习 1-自己定义接口生成头文件

    接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序中头文件定义和通过wsdl生成的头文件的内容,可以发现,头文件中都会出现以下几行信息 //gsoap ns service ...

  2. sed替换

    1. sed可以替换给定的文本中的字符串,可以利用正则表达式进行匹配$ sed 's/pattern/replace_string/' file或者$ cat file | sed 's/patter ...

  3. loadimage1();有问题

    f.Read(pBuffer, nSize)不能少,少了虽然能读进去数据但是不能显示成图片,可能原因是存进的数据并不是图片数据! 输入图片测试,但是没有CFile先Open再Read

  4. Ubantu apt source 国内

    位置 /etc/apt/sources.list apt-get update deb http://mirrors.163.com/ubuntu/ precise main restricted u ...

  5. 深入理解JS之Scope链

    JS被很多人认为是『拙劣的语言』,被这门语言里的各种离奇的事情整的团团转,这篇文章主要来讲讲JS中的Scope链,其主要是影响JS中的变量作用域. 注:本文适合稍有一定JS基础的同学 目录: 初步认识 ...

  6. 如何把IOS应用,发给别人测试?

    ios应用,除了用XCODE连接真实设备调试以外,也可以制作ipa安包,发给别人测试.下面是具体步骤: 1. 把要测试的设备标识添加到你苹果开发账号的调试设备里.(可以用xcode或者itools查看 ...

  7. 三分搜索-ZOJ LightBulb

    开始算法基础学习的第一天 今天学习的内容是三分搜索 相对来说很基础的内容(还是觉得脑子不够用) 三分搜索主要用于凸函数查找极大值. (盗个图) 如图所示 若要查找该函数的最大值 可以考虑和二分法一样的 ...

  8. centos7 install k8s centos 安装 kubernetes 详细

    参考: http://blog.opskumu.com/k8s-cluster-centos7.html https://ylinux.org/note/article/1207 http://mub ...

  9. centos6安装系统时选包

    date: 2018-06-05   11:44:06 1,系统:minimal   2,包组:     Base System :  Base.Compatibility libraries.Deb ...

  10. sql语句判断身份证性别等

    SELECT t.card_number ,) AS "省份", SUBSTR(t.card_number,,) "出生年月", SUBSTR(t.card_n ...