進(jìn)程:處于運(yùn)行狀態(tài)的應(yīng)用程序(工廠)
線程:執(zhí)行任務(wù)的最小單元(工人)
每個(gè)進(jìn)程默認(rèn)都有一個(gè)線程,這個(gè)線程叫主線程,其他的線程都叫子線程
python中threading模塊專門提供和線程相關(guān)的類和方法
python3通過兩個(gè)標(biāo)準(zhǔn)庫_thread 和 threading 提供對(duì)線程的支持缕题。
_thread 提供了低級(jí)別的、原始的線程以及一個(gè)簡單的鎖
threading 模塊除了包含 _thread 模塊中的所有方法外今缚,還提供的其他方法
1.線程模塊
threading.currentThread() -- 返回當(dāng)前的線程變量
threading.enumerate(): 返回一個(gè)包含正在運(yùn)行的線程的list漫蛔。正在運(yùn)行指線程啟動(dòng)后、結(jié)束前宝冕,不包括啟動(dòng)前和終止后的線程张遭。
threading.active_count(): 返回正在運(yùn)行的線程數(shù)量,與len(threading.enumerate())有相同的結(jié)果地梨。
除了使用方法外菊卷,線程模塊同樣提供了Thread類來處理線程,Thread類提供了以下方法:
run(): 用以表示線程活動(dòng)的方法宝剖。
start():啟動(dòng)線程活動(dòng)洁闰。
join([time]): 如果希望某個(gè)任務(wù)是在某個(gè)線程結(jié)束后才執(zhí)行,那就將這個(gè)任務(wù)的開始代碼放在對(duì)應(yīng)的線程對(duì)象調(diào)用join方法的后面
isAlive(): 返回線程是否活動(dòng)的万细。
getName(): 返回線程名渴庆。
setName(): 設(shè)置線程名。
2.創(chuàng)建自己的線程類
1)聲明一個(gè)類繼承Thread
2)實(shí)現(xiàn)run方法雅镊,這個(gè)方法中的任務(wù)就是需要在子線程中執(zhí)行的任務(wù)
注意:一個(gè)進(jìn)程中如果有多個(gè)線程襟雷,程序會(huì)在所有的線程都結(jié)束的任務(wù)結(jié)束。發(fā)生異常和崩潰其實(shí)崩潰的是線程
- 用子類直接創(chuàng)建線程對(duì)象
- 通過start去執(zhí)行子線程中的任務(wù)
注意:不能通過線程對(duì)象去直接調(diào)用run方法仁烹,因?yàn)檫@樣調(diào)用不會(huì)在子線程中執(zhí)行任務(wù)
3.線程共享數(shù)據(jù)時(shí)遇到的問題和解決辦法
1.問題
當(dāng)多個(gè)線程同時(shí)對(duì)一個(gè)數(shù)據(jù)進(jìn)行讀寫操作耸弄,可能會(huì)出現(xiàn)一個(gè)線程剛把數(shù)據(jù)讀出來還未來得及寫進(jìn)去,另外一個(gè)線程進(jìn)行讀操作的數(shù)據(jù)操作卓缰,會(huì)造成數(shù)據(jù)紊亂
2.解決 - 加鎖(Thread的lock類)
1)保證每個(gè)數(shù)據(jù)對(duì)應(yīng)一個(gè)鎖對(duì)象
2)操作數(shù)據(jù)前加鎖计呈,數(shù)據(jù)操作完成后解鎖