threadDalmon()方法的线程.Thread

时间:2011-02-26 14:22:13

标签: python multithreading

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

4 个答案:

答案 0 :(得分:38)

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

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几乎没有关系。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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')

输出:

main done

Process finished with exit code 0

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

thread = Thread(target=worker)

重新运行并查看输出:

main done
daemon done

Process finished with exit code 0

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

  

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


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

答案 3 :(得分:0)

我已经调整了@ unutbu的python 3答案。确保从命令行运行此脚本,而不是像jupyter notebook这样的交互式环境。

import queue
import threading


def basic_worker(q):
    while True:
        item = q.get()
        # do_work(item)
        print(item)
        q.task_done()


def basic():    
    q = queue.Queue()
    for item in range(4):
        q.put(item)    

    for i in range(3):
         t = threading.Thread(target=basic_worker,args=(q,))
         t.daemon = True
         t.start()

    q.join()       # block until all tasks are done
    print('got here')

basic()

因此,当您注释掉守护程序行时,您会注意到程序没有完成,您必须手动中断它。 将线程设置为守护程序线程可确保它们在完成后被终止。

注意:如果你用另一个条件替换无限while循环,你可以在没有守护进程线程的情况下实现相同的功能:

def basic_worker(q):
        while not q.empty():
            item = q.get()
            # do_work(item)
            print(item)
            q.task_done()