python-線程是守護線程以及守護線程與守護進程的區別


1.線程與進程運行完畢的區別:

    1.主進程運行完畢指的是主進程代碼運行完畢

    2.主線程運行完畢指的是所在的進程內的所有非守護線程運行完畢后,主線程才算運行完畢

        強調:運行完畢,並非是終止

 2.守護進程:主進程代碼運行完畢,守護進程也就結束                  (守護的是主進程)

                    主進程要等非守護進程都運行完畢后再回收子進程的資源(否則會產生僵屍進程)才結束

                    主進程等子進程是因為主進程要給子進程收屍(代用wait方法向操作系統發起回收資源信號(pid號,狀態信息))

    守護線程:非守護線程代碼運行完畢,守護線程也就結束           (守護的是非守護線程)

                     主線程在其他非守護線程運行完畢后才算結束(守護線程在此時就會被回收)

                    強調:主線程也是非守護線程(進程包含了線程)

        總結:

                主線程的結束意味着進程結束,進程整體的資源都會被回收,而進程必須保證非守護線程都運行完畢后才能結束

 

                守護進程:主進程代碼運行完畢,守護進程也就結束

                守護線程:非守護線程運行完畢,守護線程結束

 

from threading import Thread, current_thread
import time


# def task():
#     print('%s is runing '%current_thread().name)
#     time.sleep(2)
#     print('%s is done'%current_thread().name)
# 
# if __name__ == '__main__':
#     t=Thread(target=task,name='守護進程')
#     t.daemon=True
#     t.start()
#     print('主')



def foo():
    print(123)
    time.sleep(5)
    print('end123')


def bar():
    print(456)
    time.sleep(2)
    print('end456')  # 守護線程:非守護線程代碼運行結束后就結束


t1 = Thread(target=foo)
t2 = Thread(target=bar)

t1.daemon = True
t1.start()
t2.start()

# t1.join()                #讓主線程原地等待子線程運行完畢后才運行下面代碼
print('main----')# 守護線程:非守護線程代碼運行結束后就結束


t1 = Thread(target=foo)
t2 = Thread(target=bar)

t1.daemon = True
t1.start()
t2.start()

# t1.join()                #讓主線程原地等待子線程運行完畢后才運行下面代碼
print('main----')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM