Python主線程和子線程
一处嫌、setDaemon(False)
當一個進程啟動之后糟描,會默認產(chǎn)生一個主線程吨掌,因為線程是程序執(zhí)行的最小單位斩个,當設置多線程時胯杭,主線程會創(chuàng)建多個子線程,在Python中受啥,默認情況下就是
setDaemon(False)
做个,主線程執(zhí)行完自己的任務以后,就退出了滚局,此時子線程會繼續(xù)執(zhí)行自己的任務居暖,直到自己的任務結束;
案例
import threading
import time
def thread():
time.sleep(2)
print('---子線程結束---')
def main():
t1 = threading.Thread(target=thread)
t1.start()
print('---主線程---結束')
if __name__ == '__main__':
main()
執(zhí)行結果
---主線程結束---
---子線程結束---
二藤肢、setDaemon(True)
當我們使用
setDaemon(True)
時太闺,這是子線程為守護線程,主線程一旦執(zhí)行結束嘁圈,則全部子線程被強制終止省骂。
案例
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()
執(zhí)行結果
---主線程結束--- # 只有主線程結束,子線程來不及執(zhí)行就被強制結束
三最住、join(線程同步)
join所完成的工作就是線程同步钞澳,即主線程任務結束以后,進入堵塞狀態(tài)涨缚,一直等待所有的子線程結束以后轧粟,主線程再終止
- 當設置守護線程時,含義是主線程對于子線程等待timeout的時間將會殺死該子線程脓魏,最后退出程序兰吟。所以說,如果有10個子線程茂翔,全部的等待時間就是每個timeout的累加和揽祥。簡單的來說,就是給每個子線程一個timeout的時間檩电,讓他去執(zhí)行,時間一到,不管任務有沒有完成俐末,直接殺死料按。
- 沒有設置守護線程時,主線程將會等待timeout的累加和這樣的一段時間卓箫,時間一到载矿,主線程結束,但是并沒有殺死子線程烹卒,子線程依然可以繼續(xù)執(zhí)行闷盔,直到子線程全部結束,程序退出旅急。
案例
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然后主線程結束藐吮,子線程繼續(xù)執(zhí)行
# 2溺拱、如果不設置timeout參數(shù)就等子線程結束主線程再結束
# 3、如果設置了setDaemon=True和timeout=1主線程等待1s后會強制殺死子線程谣辞,然后主線程結束
print('---主線程結束---')
if __name__ == '__main__':
main()
執(zhí)行結果
---主線程結束---
---子線程結束---