为什么这些守护程序线程不会被杀死?

时间:2019-02-06 20:24:52

标签: python multithreading daemon hang

我正在学习有关线程之间共享数据的知识,偶然发现了这个不同的问题。据我了解,守护线程在主线程完成时被杀死。简单的代码如下:

import threading
from time import sleep

def thread(Nr):
    global x
    lock.acquire()
    x = Nr
    print(x)
    sleep(4)
    print(x)
    lock.release()

    return 0

#################################################################################

x = 2
lock = threading.Lock()

for i in range(6):
    #print("Thread Nr: ", i)
    arg1 = i
    t = threading.Thread(target = thread, args = (arg1,), name = arg1)
    t.setDaemon(True)
    print("new thread started : %s" % (str(threading.current_thread().ident)))    
    t.start()
    sleep(1)

print("Main thread end")

我正在启动6个线程,这是我在IDLE python 3.7.2中的输出:

new thread started : 940
0
new thread started : 940
new thread started : 940
new thread started : 940
new thread started : 9400

1
new thread started : 940
Main thread end
>>> 1
2
2
3
3
4
4
5
5

因此,如您所见,即使线程是消声的,线程也继续在主线程之后运行。我发现的一件有趣的事情是如果它们是从Windows cmd而不是IDLE运行的,则它们在“主线程结束”之后不打印任何内容。

有人知道这里发生了什么吗?

谢谢:)

1 个答案:

答案 0 :(得分:0)

可以,但是不在您的IDLE中。

在IDLE中运行东西不是您应该依靠的东西。重要的是您的命令提示符。例如,您不能在IDLE中真正使用多处理库。

就您的IDLE而言,我相信线程是连续的,因为在shell(IDLE)中,您实际上并未完成脚本/程序。您可以添加新命令的事实表明,程序仍在运行-以等待下一次输入的形式。

Shell类似于程序,脚本末尾带有(见下文)

while True:
    exec(raw_input('>>> '))

这意味着您的主线程仍在运行,因此将守护程序设置为true还是false无关紧要

如果您想亲自看看,请在打印后添加

exit(0)

看看会发生什么

enter image description here