• 守护线程


     守护线程

    无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

    需要强调的是:运行完毕并非终止运行

    1、对主进程来说,运行完毕指的是主进程代码运行完毕
    
    2、对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
    

    详细解释:

    1、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
    
    2、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

    在一个进程内,如果不开其它线程,默认就只有一个主线程,主线程代码运行完,改进程结束

    在一个进程内,开多线程,主线程在运行完毕后,等待其它线程运行完毕后,结束。主线程结束代表这个进程结束

    (主线程在运行程度上代表了进程的生命周期)

    验证

    from threading import Thread
    import time
    
    
    def sayhi(name):
        time.sleep(2)
        print('%s say hello' %name)
    
    
    if __name__ == '__main__':
        t = Thread(target=sayhi,args=('egon',))
        # t.setDaemon(True)     # 必须在t.start()之前设置
        t.daemon = True    # 等同于 t.setDaemon(True)
        t.start()
    
        print('主线程')
        print(t.is_alive())    # 这行代码出现,主线程结束

    执行结果

    主线程
    True
    

    练习

    思考下述代码的执行结果有可能是哪些情况?为什么?

    from threading import Thread
    import time
    
    
    def foo():
        print(123)
        time.sleep(1)
        print("end123")
    
    
    def bar():
        print(456)
        time.sleep(3)
        print("end456")
    
    
    if __name__ == '__main__':
        t1 = Thread(target=foo)
        t2 = Thread(target=bar)
    
        t1.daemon = True
        t1.start()
        t2.start()
        print("main-------")
        
    

      执行结果:

    123
    456
    main-------
    end123
    end456

     
  • 相关阅读:
    过国内外的waf的一些奇淫绝技<转>
    杂七杂八的敏感文件注释<持续更新帖>
    [讨论]“传递式”的攻击思想<转LN>
    无线hacking集合贴,持续更新~
    dede找后台《转》
    开源MFC扩展界面库:Ultimate Toolbox的编译(转)
    【转】Windows环境下设置Tomcat6启动参数
    [转]关于dll文件的生成以及找不到jni.h的解决办法
    VBA 7788
    ODBC连接EXCEL的一些问题
  • 原文地址:https://www.cnblogs.com/fantsaymwq/p/10130239.html
Copyright © 2020-2023  润新知