线程资源已经被销毁?
它的子线程会被自动回收吗?
以下代码输出
test1
aps
irr
irr
irr
没想明白为什么.
代码如下
import threading
import time
def irr():
print('irr')
def aps():
print('aps')
while True:
time.sleep(6)
irr()
def view():
t2 = threading.Thread(target=aps)
t2.daemon = True
t2.start()
print('test1')
t = threading.Thread(target=view)
t.daemon = True
t.start()
while True:
time.sleep(1)
1
weyou 2020 年 12 月 17 日 via Android
输出没问题啊,后面是一直输出 irr 。
|
3
lanshee 2020 年 12 月 17 日
小白问下,这个父线程退出了嘛?
|
4
cbiqih 2020 年 12 月 17 日
设置了 daemon = True, 则为守护进程, 要等所有子进程退出了, 父进程才会结束的~
|
5
4everLoveU 2020 年 12 月 17 日
主线程显然不会退出啊,设置守护线程,必须等待所有守护线程结束之后才会退出
|
6
chaleaoch OP @4everLoveU
@cbiqih 这个代码是 主线程 起了一个 子线程 子线程起了一个孙线程. 现在 子线程结束释放了 但是孙线程还在. 我的问题是, 为什么孙线程没有被强制释放. 后来调查了一下.好像 python 里面没有父子概念, 只有主线程和非主线程. 上面代码里面的例子, 那两个线程实际上是兄弟关系. 所以 view 线程跑完了 aps 还活着. |
7
xx6412223 2020 年 12 月 17 日 楼上解释的都是小问题:
非守护线程一般作为 main thread, 在非守护线程挂掉之前,程序不会退出(排除异常场景) daemon =true 是守护线程,程序退出后他们也随着挂了,所以一般用作垃圾回收,心跳等工作。 |
8
xx6412223 2020 年 12 月 17 日 补充一下,除了语言层有特殊设定,线程的生命周期没有父子关系
|
9
4everLoveU 2020 年 12 月 17 日 线程的父对象都是 Thread,所有基于 Thread 创建的线程都是平等的,逻辑上看着是多重派生,实际上不存在什么父子关系,每个线程都是在自己的隔离环境中运行的
主线程就是当前脚本的运行线程及其环境,t/t2 都是主线程中的守护线程,不存在 t2 是 t 线程中的一个隔离线程,所以你说的兄弟关系比较恰当。 |