zoukankan      html  css  js  c++  java
  • Python daemon守护线程详解 Y

    前面不只一次提到,当程序中拥有多个线程时,主线程执行结束并不会影响子线程继续执行。换句话说,只有程序中所有线程全部执行完毕后,程序才算真正结束。

    下面程序演示了包含 2 个线程的程序执行流程:

     1 import threading
     2 
     3 #主线程执行如下语句
     4 for i in range(5):
     5     print(threading.current_thread().getName())
     6 
     7 #定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数
     8 def action(*add):
     9     for arc in add:
    10         #调用 getName() 方法获取当前执行该程序的线程名
    11         print(threading.current_thread().getName() +" "+ arc)
    12 #定义为线程方法传入的参数
    13 my_tuple = ("http://c.biancheng.net/python/",\
    14             "http://c.biancheng.net/shell/",\
    15             "http://c.biancheng.net/java/")
    16 #创建线程
    17 thread = threading.Thread(target = action,args =my_tuple)
    18 #启动线程
    19 thread.start()

    程序执行结果为:

    MainThread
    MainThread
    MainThread
    MainThread
    MainThread
    Thread-1 http://c.biancheng.net/python/
    Thread-1 http://c.biancheng.net/shell/
    Thread-1 http://c.biancheng.net/java/

    显然,只有等 MatinThread 和 Thread-1 全部执行完之后,程序才执行结束。

    除此之外,Python 还支持创建另一种线程,称为守护线程(或后台线程)。此类线程的特点是,当程序中主线程及所有非守护线程执行结束时,未执行完毕的守护线程也会随之消亡(进行死亡状态),程序将结束运行。

    Python 解释器的垃圾回收机制就是守护线程的典型代表,当程序中所有主线程及非守护线程执行完毕后,垃圾回收机制也就没有再继续执行的必要了。

    前面章节中,我们学习了 2 种创建线程的方式,守护线程本质也是线程,因此其创建方式和普通线程一样,唯一不同之处在于,将普通线程设为守护线程,需通过线程对象调用其 damon 属性,将该属性的值该为 True。

    并且需要注意的一点是,线程对象调用 daemon 属性必须在调用 start() 方法之前,否则 Python 解释器将报 RuntimeError 错误。

    举个例子,下面程序演示了如何创建一个守护线程:

    import threading
    #定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数
    def action(length):
        for arc in range(length):
            #调用 getName() 方法获取当前执行该程序的线程名
            print(threading.current_thread().getName()+" "+str(arc))
    #创建线程
    thread = threading.Thread(target = action,args =(20,))
    #将thread设置为守护线程
    thread.daemon = True
    #启动线程
    thread.start()
    #主线程执行如下语句
    for i in range(5):
        print(threading.current_thread().getName())

    程序中第 10 行代码处,通过调用 thread 线程的 daemon 属性并赋值为 True,则该 thread 线程就变成了守护线程。由于该程序中除了 thread 守护线程就只有主线程 MainThread,因此只要主线程执行结束,则守护线程将随之消亡。程序执行结果为:

    Thread-1 0
    MainThread
    MainThread
    Thread-1 1
    MainThread
    Thread-1 2
    MainThread
    MainThread
  • 相关阅读:
    Jquery 中止正在执行的AJAX
    SQL语句添加说明
    MINIUI基本学习笔记
    ADO.NET使用事务简单实例
    通过反射将Datetable转换为泛型List<T>
    C语言七夕必备神器,待那烟花灿烂时,依旧做个单身狗
    七夕来了,请用C 语言和我交流
    C语言第一个字符串Hello,C语言基础教程之字符串
    无形细节最为致命,C语言中与零值比较那些小事儿
    C语言讨论象棋将帅问题,代码短又美!
  • 原文地址:https://www.cnblogs.com/DJRemix/p/12794100.html
Copyright © 2011-2022 走看看