線程的定義及線程同步

線程:cpu調度執行的最小單位,也叫執行路徑,不能獨立存在,以來進程存在,一個進程至少有一個線程,叫做主線程,而多個線程共享內存(數據共享,共享全局變量),從而極大地提高了程序的運行效率。

線程同步:

setDaemon(False)當一個進程啓動之後,會默認產生一個主線程,因爲線程是程序執行的最小單位,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下就是setDaemon(False)主線程執行完自己的任務以後,就退出了,此時子線程會繼續執行自己的任務,知道自己的任務結束。

例子:

import threading 
import time

def thread():
    time.sleep(1)
    print('---子線程結束---')

def main():
    t1 = threading.Thread(target=thread)
    t1.start()
    print('---主線程--結束')

if __name__ =='__main__':
    main()
#執行結果

setDaemon(True)當我們使用setDaemon(True)時,這是子線程爲守護線程,主線程一旦執行結束,則全部子線程被強制終止。

例子:

import threading
import time
def thread():
    time.sleep(2)
    print('---子線程結束---')
def main():
    t1 = threading.Thread(target=thread)
    t1.setDaemon(True)#設置子線程守護主線程
    t1.start()
    print('---主線程結束---')

if __name__ =='__main__':
    main()
#執行結果
#只有主線程結束,子線程來不及執行就被強制結束

join(線程同步)join所完成的工作就是線程同步,即主線程任務結束以後,進入阻塞狀態,一直等待所有的子線程結束以後,主線程再終止。

當設置守護線程時,含義是主線程對於子線程等待timeout的時間將會殺死該子線程,最後退出程序,所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和,簡單的來說,就是給每個子線程一個timeout的時間,讓他去執行,時間一到,不管任務有沒有完成,直接殺死。

沒有設置守護線程時,主線程將會等待timeout的累加和這樣一段時間,時間一到,主線程結束,但是並沒有殺死子線程,子線程依然可以繼續執行,直到子線程全部結束,程序退出。

例子:

import threading
import time

def thread():
    time.sleep(2)
    print('---子線程結束---')

def main():
    t1 = threading.Thread(target=thread)
    t1.setDaemon(True)
    t1.start()
    t1.join(timeout=1)
          #1 線程同步,主線程堵塞1s 然後主線程結束,子線程繼續執行
          #2 如果不設置timeout參數就等子線程結束主線程再結束
          #3 如果設置了setDaemon=True和timeout=1主線程等待1s後會強制殺死子線程,然後主線程結束
    print('---主線程結束---')

if __name__=='__main___':
    main()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章