【问题标题】:Why don't these daemon threads get killed?为什么这些守护线程不会被杀死?
【发布时间】:2019-02-06 20:24:51
【问题描述】:

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

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 运行,它们在“主线程结束”之后不会打印任何内容。

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

谢谢:)

【问题讨论】:

  • 如果您的问题已得到解答,请确保接受答案以供进一步参考。

标签: python multithreading daemon freeze


【解决方案1】:

他们有,但不是在你的 IDLE 中。

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

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

Shell 就像在脚本末尾带有(见下文)的程序

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

也就是说,你的主线程还在运行,所以你设置守护进程是真还是假都没有关系

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

exit(0)

看看会发生什么

【讨论】:

  • 哦,感谢您的澄清。你用什么在 Windows 上测试 py 脚本? Win 命令提示符?
  • 取决于应用程序。用于脚本 IDLE,用于 GUI (kivy) 命令提示符。两者都可以在 PyCharm 或 Visual Code IDE 中完成。
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多