2011-02-26 42 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)的事實。 所以請在使用此示例時進行更改