python多線程的join起什么作用?
首先需要明確幾個概念:
知識點一:當一個進程啟動之后,會默認產(chǎn)生一個主線程,因為線程是程序執(zhí)行流的最小單元,當設置多線程時,主線程會創(chuàng)建多個子線程,在python中,默認情況下(其實就是setDaemon(False)),主線程執(zhí)行完自己的任務以后,就退出了,此時子線程會繼續(xù)執(zhí)行自己的任務,直到自己的任務結(jié)束,例子見下面一。
知識點二:當我們使用setDaemon(True)方法,設置子線程為守護線程時,主線程一旦執(zhí)行結(jié)束,則全部線程全部被終止執(zhí)行,可能出現(xiàn)的情況就是,子線程的任務還沒有完全執(zhí)行結(jié)束,就被迫停止,例子見下面二。
知識點三:此時join的作用就凸顯出來了,join所完成的工作就是線程同步,即主線程任務結(jié)束之后,進入阻塞狀態(tài),一直等待其他的子線程執(zhí)行結(jié)束之后,主線程在終止,例子見下面三。
知識點四:join有一個timeout參數(shù):
當設置守護線程時,含義是主線程對于子線程等待timeout的時間將會殺死該子線程,最后退出程序。所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子線程一個timeout的時間,讓他去執(zhí)行,時間一到,不管任務有沒有完成,直接殺死。沒有設置守護線程時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結(jié)束,但是并沒有殺死子線程,子線程依然可以繼續(xù)執(zhí)行,直到子線程全部結(jié)束,程序退出。