線程: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()