zoukankan      html  css  js  c++  java
  • Python多线程中的setDaemon

    关于thread.setDaemon()

    若在主线程中创建了子线程,当主线程结束时根据子线程daemon(设置thread.setDaemon(True))属性值的不同可能会发生下面的两种情况之一:

    • 如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;
    • 如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。

    属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。

    应用场景

    当启动一个线程时设置thread.setDaemon(True),则该线程为守护线程(也可以称为后台线程)。表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免了孤儿进程的出现。

    当不设置或者thread.setDaemon(False)时,主进程执行结束时,会等待线程结束。

    应用:如保持网络连接(发送keep-alive心跳包)或者后台监控的线程,负责内存管理与垃圾回收(实际上JVM就是这样做的),这些线程与实际提供应用服务的线程有了逻辑上的”前/后”的概念,而如果主线程已经退出,那么这些后台线程也没有存在的必要。
    如果没有这一机制,那么我们在主线程完成之后,还必须逐个地检查后台线程,然后在主线程退出之前,逐个地关闭它们. 有了前后线程的区分, 我们只需要负责管理前台线程, 完成主要的逻辑处理之后退出即可.

    例子

    当子线程不设置时,主进程结束后,子线程会继续执行完后,程序结束。

    import time
    from hashlib import md5
    from threading import Thread
    
    def pmd(md):
        time.sleep(3) #使用sleep使得该线程比主线程晚结束
        print("backend recording:",md)
    
    
    def giveures(s):
        md = md5(s.encode('utf-8'))
        res = md.digest()
        t = Thread(target=pmd,args=(s,))
        #t.setDaemon(True) 默认情况:t.setDaemon(False)
        t.start()
        return res
    
    s = 'chrisyang'
    res = giveures(s)
    print(res)

    当设置时,主进程不会等待子线程,当主线程结束,子线程就会被强制停止运行并回收。

    import time
    from hashlib import md5
    from threading import Thread
    
    def pmd(md):
        time.sleep(3) #使用sleep使得该线程比主线程晚结束
        print("backend recording:",md)
    
    
    def giveures(s):
        md = md5(s.encode('utf-8'))
        res = md.digest()
        t = Thread(target=pmd,args=(s,))
        t.setDaemon(True)
        t.start()
        return res
    
    s = 'chrisyang'
    res = giveures(s)
    print(res)

    例子来源:https://blog.csdn.net/m0_37422289/article/details/80696761

  • 相关阅读:
    超简单tensorflow入门优化程序&&tensorboard可视化
    tf.random_normal()函数
    tensorflow中创建多个计算图(Graph)
    tensorflow中有向图(计算图、Graph)、上下文环境(Session)和执行流程
    配置错误 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项
    取奇偶数
    DNS添加/修改/查询/删除A记录
    IE自动化
    Get-ChildItem参数之 -Exclude,Filter,Recurse应用
    自动下载
  • 原文地址:https://www.cnblogs.com/-wenli/p/12907355.html
Copyright © 2011-2022 走看看