• 守护线程


    线程结束守护线程

    一、守护线程

    无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁。需要强调的是:运行完毕并非终止运行。

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

    二、详细解释

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

    三、代码实例

    from threading import Thread
    import time
    def task(name):
        print(f"{name}线程开始")
        time.sleep(3)
        print(f'{name}线程结束')
    
    
    
    t = Thread(target=task, args=('t',))
    t2 = Thread(target=task,  args=('t2',))
    #必须在t.start()之前设置
    t.daemon = True # 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
    
    t2.start()
    t.start()
    print('主')
    print(t.is_alive())
    

    t2线程开始
    t线程开始

    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")
    
    
    t1=Thread(target=foo)
    t2=Thread(target=bar)
    
    t1.daemon=True
    t1.start()
    t2.start()
    print("main-------")
    
    

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

    四、总结

    1. 在主进程中的守护进程是主进程结束之后,守护的子进程就会结束
    2. 而在主线程中的守护线程,即使主进程运行结束了,守护的子线程还不会结束,只有等所有非守护线程运行完毕之后才会结束
    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    原创 C++应用程序在Windows下的编译、链接(四)动态链接
    IE浏览器 json异常
    Linux系统github使用
    Mysql in 排序
    转 php四种基础算法:冒泡,选择,插入和快速排序法
    转 mysql取今天,明天,工作日,周末,本周,下周,下月数据
    下载远程图片到本地
    转 PHP中SQL_CALC_FOUND_ROWS与FOUND_ROWS()和count()
    星级点评
    21个值得收藏的Javascript技巧
  • 原文地址:https://www.cnblogs.com/randysun/p/11536300.html
Copyright © 2020-2023  润新知