Python通過兩個標準庫thread和threading提供對線程的支持震蒋。thread提供了低級別的、原始的線程以及一個簡單的鎖躲庄。threading模塊對thread進行了進一步的封裝查剖,因此在使用的時候,一般使用threading模塊噪窘。
多任務可以由多進程完成笋庄,也可以由一個進程內(nèi)的多線程完成。進程是由若干線程組成的倔监,一個進程至少有一個線程直砂。
1、使用threading模塊創(chuàng)建線程
例:利用Thread類創(chuàng)建線程
與利用Process()創(chuàng)建進程類似浩习,Thread()類的target函數(shù)接受一個函數(shù)静暂,用于Thread類執(zhí)行時調(diào)用,如果調(diào)用的函數(shù)需要參數(shù)瘦锹,則通過args參數(shù)傳遞一個元組類型的參數(shù)列表籍嘹。
例:調(diào)用帶參數(shù)的函數(shù)
當需要一些復雜的邏輯時,直接用Thread()調(diào)用函數(shù)總顯得有些復雜弯院,我們可以利用Thread創(chuàng)建的子類滿足需求辱士。
2、使用Thread子類創(chuàng)建線程
例:利用Thread子類創(chuàng)建線程
我們自己創(chuàng)建的類听绳,繼承自Thread颂碘,當執(zhí)行start()方法時,Python解釋器會調(diào)用自定義類中重寫的run()方法。
3头岔、多個線程的執(zhí)行順序
當啟動多個線程時塔拳,線程之間的執(zhí)行是沒有順序的,線程之間的調(diào)度是由操作系統(tǒng)的調(diào)度算法來決定的峡竣。
例:啟動多個線程
4靠抑、多個線程之間共享全局變量
多個進程之間是相互獨立的,因此多個進程之間是不會共享全局變量的适掰。但是多個線程之間會共享全局變量颂碧,當一個線程改變?nèi)肿兞繒r,另一個線程中的全局變量會隨之改變类浪。
例:多線程之間共享全局變量
5载城、多個線程共享全局變量造成的問題
多個線程共享全局變量的優(yōu)點是费就,不再像多個進程那樣诉瓦,如果要共享數(shù)據(jù)需要借助第三方才能夠?qū)崿F(xiàn),比如Queue力细,但是如果處理不好多線程共享全局變量睬澡,會發(fā)生意想不到的結(jié)果。
例:多個線程共享全局變量造成的問題
6眠蚂、解決多線程共享全局變量BUG
我們可以定義另一個全局變量猴贰,來判斷當前線程的狀態(tài),只有當一個線程執(zhí)行完之后河狐,另一個線程才能開啟米绕。
例:定義線程是否執(zhí)行完標記
由以上程序可知,定義了判斷線程結(jié)束標記以后馋艺,雖然能夠解決問題栅干,但是當?shù)谝粋€線程執(zhí)行時,第二個線程在循環(huán)判斷標記是否已經(jīng)改變捐祠,循環(huán)判斷會占用CPU資源碱鳞,對性能造成影響。
7踱蛀、利用互斥鎖
某個線程要共享數(shù)據(jù)時窿给,先將其鎖定,此時資源的狀態(tài)為“鎖定”率拒,其他線程不能更改崩泡;直到該線程釋放資源,將資源的狀態(tài)變成“非鎖定”猬膨,其他的線程才能再次鎖定該資源角撞。互斥鎖保證了每次只有一個線程進入寫入操作,從而保證了多線程情況下數(shù)據(jù)的正確性谒所。
創(chuàng)建鎖
mutex=threading.Lock()
鎖定
mutex.acquire([blocking])#里面可以加blocking(等待的時間)或者不加热康,不加就會一直等待(堵塞)
釋放
mutex.release()
只要一上鎖,由多任務變?yōu)閱稳蝿?相當于只有一個線程在運行劣领。