線程創建
Thread 類 創建線程的方法
1.直接傳要運行的方法
2.繼承thread類,重寫run方法
構造方法
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group :線程組 暫未實現,將來擴展 ,必須爲None
target:要執行的方法, 由run() 方法回調
name:線程名字
args/kwargs: 需要傳入的方法參數
daemon:守護進程設置
實例方法
start():啓動線程,一個線程對象只能調用一個,在一個單獨的控制線程中,被對象的
run()方法調用, 若同一個線程對象被多次調用回raise 一個RuntimeError
run(): 表示一個線程活動,可以在子類中覆蓋該方法
join(timeout=None) :阻塞當前上下文環境的線程,直到當前線程終止,或timeout
超時
ps:由於join()始終返回None,因此必須在join()之後調用is_alive(),如果線程是活動狀態,那麼就是因爲超時返回的
is_alive(): 判斷線程是否活動狀態
name 獲取/設置線程名
get/setName(name):
Old getter/setter API for name; use it directly as a property instead
daemon:一個布爾值,指示此線程是否爲守護程序線程(True)或不是(False)。 必須在調用start()之前設置它,否則引發RuntimeError。
isDaemon()
setDaemon()
Old getter/setter API for daemon; use it directly as a property instead.
daemon 測試:
沒有設置 daemon的情況:
設置了daemon 情況
總結:如果設置setdaemon(True),主線程在執行,後臺線程也在執行,若主線程已經結束,那麼後臺進程也立即結束,不管是執行完成
join 測試
join 測試
執行結果(注意主線程結束的位置,調用後,是子線程全部執行完成,再繼續執行主線程,join 可以配置timeout的)
不帶join 的情況
執行結果情況:
總結:
主線程A中,創建了子線程B,並且在主線程A中調用了B.join(),那麼,主線程A會在調用的地方等待,直到子線程B完成操作後,再往下執行,
join 和daemon 區別
daemon:
主線程A中,創建了子線程B,並且在主線程A中調用了B.setDaemon(),這個的意思是,把主線程A設置爲守護線程,這時候,要是主線程A執行結束了,就不管子線程B是否完成,一併和主線程A退出.這就是setDaemon方法的含義,這基本和join是相反的。
特別注意的:必須在start() 方法調用之前設置,如果不設置爲守護線程,程序會被無限掛起,只有等待了所有線程結束它才結束。
多線程變單線程執行的例子
線程創建
join 測試
daemon測試