2011-02-26 43 views
17

我是一个新手在python编程,我的理解是,一个进程可以是一个守护进程,但一个线程在守护进程模式,我无法理解这个用例,我会请求python大师们帮助我理解这一点。提前致谢。setDaemon函数线程

+0

对此的最佳答案是http://stackoverflow.com/a/190017/260122。 – clacke 2016-04-11 12:21:25

+1

[Daemon Threads Explanation]可能的重复(http://stackoverflow.com/questions/190010/daemon-threads-explanation) – clacke 2016-04-11 12:23:40

回答

33

下面是一些基本的代码使用线程:

import Queue 
import threading 

def basic_worker(queue): 
    while True: 
     item = queue.get() 
     # do_work(item) 
     print(item) 
     queue.task_done() 
def basic(): 
    # http://docs.python.org/library/queue.html 
    queue = Queue.Queue() 
    for i in range(3): 
     t = threading.Thread(target=basic_worker,args=(queue,)) 
     t.daemon = True 
     t.start() 
    for item in range(4): 
     queue.put(item) 
    queue.join()  # block until all tasks are done 
    print('got here') 

basic() 

当你运行它,你就会得到

% test.py 
0 
1 
2 
3 
got here 

现在注释掉该行:再次

  t.daemon = True 

运行它,你会看到脚本打印出相同的结果,但挂起。 主线程结束(请注意,打印了got here),但第二个线程永远不会结束。

相反,当t.daemon设置为True时,线程t在主线程结束时终止。

请注意,“守护程序线程”与daemon processes无关。

+0

谢谢,这很有帮助 – hue 2011-02-26 15:13:04

+0

应该是t.SetDaemon(True)? – GreenAsJade 2012-12-30 11:43:16

+7

@GreenAsJade:[t.setDaemon(True)](http://docs.python.org/2/library/threading.html#threading.Thread.setDaemon)是旧API的一部分。现在,[t.daemon = True](http://docs.python.org/2/library/threading.html#threading.Thread.daemon)是使't'成为守护线程的推荐方式。 – unutbu 2012-12-30 11:58:50

2

模块队列已被重命名为以Python3开头的队列,以更好地反映模块中有几个队列类(lifo,fifo,priority)的事实。 所以请在使用此示例时进行更改