threadDalmon()方法的线程.Thread

hue*_*hue 24 python multithreading

我是python编程的新手,我理解的是一个进程可以是一个守护进程,但是守护进程模式中的一个线程,我无法理解这个用例,我会请求python gurus来帮助我理解这个.

unu*_*tbu 39

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

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()
Run Code Online (Sandbox Code Playgroud)

当你运行它,你得到

% test.py
0
1
2
3
got here
Run Code Online (Sandbox Code Playgroud)

现在注释掉这条线:

         t.daemon = True
Run Code Online (Sandbox Code Playgroud)

再次运行它,你会看到脚本打印相同的结果,但挂起.主线程结束(注意got here已打印),但第二个线程永远不会完成.

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

请注意,"守护程序线程"与守护程序进程几乎没有关系.

  • @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`成为守护程序线程的推荐方法. (7认同)
  • 那应该是 t.SetDaemon(True) 吗? (2认同)

the*_*eld 8

看起来人们打算使用 Queue 来解释线程,但我认为应该有一种更简单的方法,通过使用time.sleep(),来演示守护线程。

通过设置daemon参数(默认为 None)来创建守护线程:

from threading import Thread
import time

def worker():
    time.sleep(3)
    print('daemon done')

thread = Thread(target=worker, daemon=True)
thread.start()

print('main done')
Run Code Online (Sandbox Code Playgroud)

输出:

main done

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

删除守护进程参数,例如:

thread = Thread(target=worker)
Run Code Online (Sandbox Code Playgroud)

重新运行并查看输出:

main done
daemon done

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

在这里我们已经看到了守护线程的区别:

如果只剩下守护线程,整个 Python 程序就可以退出。


isDaemon()并且setDaemon()是旧的 getter/setter API。建议使用构造函数参数,如上所述,或daemon属性。