2014-02-18 149 views
6

我有一些创建恶魔线程的Python代码。父线程几乎立即结束,但守护线程继续打印睡眠。当父线程退出时,Python守护进程线程不会退出

import threading 
import time 
def int_sleep(): 
    for _ in range(1, 600): 
     time.sleep(1) 
     print("sleep") 

def main(): 
    thread = threading.Thread(target=int_sleep) 
    thread.daemon = True 
    thread.start() 
    time.sleep(2) 
    print("main thread end...") 

thread = threading.Thread(target=main) 
thread.start() 

内容sys.version:

'3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)]' 

打印:

sleep 

main thread end... 

sleep 

sleep 

sleep 

为什么不Python的守护线程退出父线程退出时?

+0

退房的thread.daemon设置.. http://stackoverflow.com/questions/4330111/python-thread -daemon-property –

回答

5

如果您为您的python线程指定thread.daemon = True,那么当只剩下守护进程时,程序将立即停止。发送到stdout的命令会丢失。

一下添加到一个名为main.py

import threading 
import time 

def int_sleep(): 
    for _ in range(1, 600): 
    time.sleep(1) 
    print("sleep") 

def main(): 
    thread = threading.Thread(target=int_sleep) 
    thread.daemon = True 
    thread.start() 
    time.sleep(2) 
    print("main thread end...") 

thread = threading.Thread(target=main) 
thread.daemon = True 
thread.start() 

运行这样的:

[email protected]:~/code/python/run01$ python --version 
Python 2.7.6 
[email protected]:~$ python main.py 
[email protected]:~$ 

见它打印任何事情,因为线程启动。您将其设置为守护进程并启动它。然后程序结束。其他注意事项:如果将此代码粘贴到python解释器中,所有打印语句都将显示在终端上,因为守护程序从不会丢失与stdout的连接。

了解更多:http://docs.python.org/2/library/threading.html

+1

为什么我们必须将主线程设置为守护进程?如果我实现这样的脚本...如果有一个线程停留在执行时,将所有的线程(在我们的例子守护线程)2秒 – user3388884

+0

嘿,我试图运行此脚本确切,一切是睡眠定时器终止后印... – user3388884

+0

这是因为你把它粘贴到一个终端,而不是一个程序,我在上面解释了这种现象。 –

3

出于完整性检查出这篇文章。 https://joeshaw.org/2009/02/24/605/

监控是在一个守护线程内完成的。 Python的文件说只 :

A thread can be flagged as a “daemon thread”. The significance 
of this flag is that the entire Python program exits when only 
daemon threads are left. 

这听起来很不错,不是吗?这个线程偶尔会抓取一些数据,当 程序关闭时,我们不需要做任何特别的事情。是的,我记得当时我也曾经相信过 。

尽管全球翻译锁,防止Python从被 真正并发反正,有一个非常现实的可能性,Python运行时已经开始 自身的拆除过程后 守护线程仍然可以执行。此过程的一个步骤似乎是 将globals()中的值设置为None,表示任何模块 解析都会导致AttributeError试图取消引用 NoneType。其他变体会导致TypeError被抛出。

我不确定这是一个已修正的错误还是存在的错误或每个设计的行为。但是,如果你看到奇怪,请将它保存在你的脑后。

因此,另一种方法是在退出标志上的子线程中循环,当完成后您可以在主标志中设置该标志。然后等待主要的子线程死亡,然后清理。

0

我只能重现由OP描述的行为('sleep'的无止境输出)if如果从python shell完成。如果从文件运行,它将按预期工作(几行'睡眠'和一行'主线程结束')

同样,如果作为文件运行,第二个程序立即退出,但同时也从python shell运行时打印无休止的“睡眠”语句。

我的结论是:因为这是蟒蛇外壳线程将继续即使在“主”完成运行,防止后台程序(一个或多个)从蟒蛇shell中运行时被终止。

难道这被认为是一个错误(即Python的行为取决于脚本的运行方式是不同的),或者是预期?我听从有经验的Pythonistas ...

BTW - 与Python 3.2.3测试

相关问题