119 python程序中的線程操做-守護線程

1、守護線程

不管是進程仍是線程,都遵循:守護xx會等待主xx運行完畢後被銷燬。須要強調的是:運行完畢並不是終止運行。python

  1. 對主進程來講,運行完畢指的是主進程代碼運行完畢
  2. 對主線程來講,運行完畢指的是主線程所在的進程內全部非守護線程通通運行完畢,主線程纔算運行完畢

1.1 詳解

  1. 主進程在其代碼結束後就已經算運行完畢了(守護進程在此時就被回收),而後主進程會一直等非守護的子進程都運行完畢後回收子進程的資源(不然會產生殭屍進程),纔會結束。
  2. 主線程在其餘非守護線程運行完畢後纔算運行完畢(守護線程在此時就被回收)。由於主線程的結束意味着進程的結束,進程總體的資源都將被回收,而進程必須保證非守護線程都運行完畢後才能結束。

重點:守護線程守護的的是進程的運行週期,只要程序中全部非守護線程都結束後,守護線程才結束線程

1.2 守護線程實例1

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=('nick',))
    t.setDaemon(True) #必須在t.start()以前設置
    t.start()

    print('主線程')
    print(t.is_alive())

主線程
Truecode

1.3 守護線程實例2

from threading import Thread,enumerate,currentThread
import time

def task():
    print('守護線程開始')
    print(currentThread())
    time.sleep(20)
    print('守護線程結束')
    

def task2():
    print('子線程 start')
    time.sleep(5)
    print(enumerate())
    print('子線程 end')

if __name__ == '__main__':
    t1 = Thread(target=task)
    t2 = Thread(target=task2)
    t1.daemon = True
    t2.start()
    t1.start()
    print('主')

子線程 start
守護線程開始

<Thread(Thread-1, started daemon 4360)>
[<_MainThread(MainThread, stopped 15104)>, <Thread(Thread-2, started 15160)>, <Thread(Thread-1, started daemon 4360)>]
子線程 end進程

相關文章
相關標籤/搜索