標籤:多個 整數 上下 結束 釋放 構造 解鎖 操作 基本
import threading 在處理一些程式時為了節約時間,可以使用多線程的方式,讓其並發去執行,從而節約時間,(注意python其實是偽多線程,其實是以我們感覺不到的速度每行代碼都按照相同時間執行) Lock當多線程同時對一個變數進行修改操作的時候,那麼可能會出現混亂,因為其是並發(算是吧)而行,(所以當兩個賦值時間相對接近時那麼其容易出現混亂)所以我們得建立鎖,讓其上一個線程賦值結束,下一個賦值再繼續 threading.Lock() 建立鎖是可用的最低級的同步指令。Lock處於鎖定狀態時,不被特定的線程擁有。Lock包含兩種狀態--鎖定和非鎖定,以及兩個基本的方法可以認為Lock有一個鎖定池,當線程請求鎖定時,將線程至於池中,直到獲得鎖定後出池。池中的線程處於狀態圖中的同步阻塞狀態 acquire(blocking=True,timeout=-1)使線程進入同步阻塞狀態,嘗試獲得鎖定
blocking:為True時,將阻塞直至鎖變成unblocked,然後設定它的狀態為locked並返回True。為False時,將不會阻塞。如果阻止設定為True的調用將被阻止,請立即返回False;否則,將鎖定設定為鎖定並返回True。鎖定 release()
釋放一把鎖,這可以從任何線程調用,而不僅僅是已經獲得鎖的進程 --------------------------------------------------------- Thread對某段代碼實行多線程,線程表示其裡面的代碼同時進行,也就是說上下兩個代碼同時進行,當執行完本條代碼就會去執行父程式碼,所以這樣就可能會出現混亂,所以我們得設定join讓其把所有子進程執行完,再執行父進程 threading.Thread(group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)線程類,有兩種使用方法,直接傳入要啟動並執行方法或從Thread繼承並覆蓋run()
group:線程組,目前還沒有 實現target: 要執行的方法,就是要執行的程式是將被run()方法調用的可調用對象。預設為None,表示不調用任何東西name:線程的名字,預設情況下以Thread-N的形式構造一個唯一的名字,N是一個小的十進位整數args:給調用程式傳入的值()kwargs:給程式傳入的值,預設為{} Thread.name線程名 Thread.ident線程的標識符 Thread.daemon布爾標誌,表示這個線程是否是守護線程 start()開始線程活動 isAlive()返回線程是否正在運行。 get/setName(name)擷取/設定後台線程(預設前台線程False)現在使用thread.name屬性,或者在執行個體化過程中傳遞該屬性 is/setDaemon(bool)擷取/設定是否守護進程。初始值從建立該線程的線程繼承並沒有非守護線程仍在運行時,程式將終止已經棄用現在使用thread.daemom屬性 setDaemon(True)(將線程聲明為守護進程,必須在start()方法調用之前設定,如果不設定為守護線程程式會被無限掛起。字線程啟動後,父線程也繼續執行,當父線程執行完最後一條語句後,沒有等待子進程,直接就退出了,同時子線程也一同結束) join([timeout])直至啟動的線程終止之前一直掛起;除非給出了timeout,否則會一直阻塞也就是等上面的程式都執行完了,再執行下面的程式(對於一些程式,可以用此方法來解決資料混亂問題,但是其需要一次次關閉,很浪費時間)(理解線程:程式先上下執行,如果遇到迴圈則丟給第二個線程來執行)----------------------------------------------------------------- Condition條件變數,通過與一個鎖關聯。需要在多個Contidion中共用一個鎖時,可以傳遞一個Lock/RLock執行個體給構造方法,否則它將自己產生一個RLock執行個體可以認為,除了Lock帶有的鎖定池外,Condition還包含一個等待池,池中的線程處於狀態圖中的等待阻塞狀態,直到另一個線程調用notify()/notifyAll()通知;得到通知後線程進入鎖定池等待鎖定 構造方法:Condition([lock/rlock])wait([timeout]): 調用這個方法將使線程進入Condition的等待池等待通知,並釋放鎖。使用前線程必須已獲得鎖定,否則將拋出異常。 notify(): 調用這個方法將從等待池挑選一個線程並通知,收到通知的線程將自動調用acquire()嘗試獲得鎖定(進入鎖定池);其他線程仍然在等待池中。調用這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將拋出異常。 notifyAll(): 調用這個方法將通知等待池中所有的線程,這些線程都將進入鎖定池嘗試獲得鎖定。調用這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將拋出異常 ----------------------------------------------------------------------------threading.currentThread()返回當前的線程變數 threading.enumerate()
返回一個包含正在啟動並執行線程的List正在運行指線程啟動後,結束前,不包括啟動前和終止後的線程 threading.activeCount()返回正在啟動並執行線程數量,與len(threading.enumerate())有相同的效果 threading.TIMEOUT_MAX設定threading全域逾時時間 ---------------------------------------------------------------------------------------------------------------------------------------------------- import threading 匯入模組 lock=threading.Lock() 建立鎖a=0thre=[]def qwer(): lock.acquire() 對其鎖定 global a 設定全域變數 a+=1 print(a) lock.release() 對其解鎖 for i in range(10): t=threading.Thread(target=qwer) 建立線程 thre.append(t) 加入列表 t.start() 啟動線程for t in thre: t.join() #等什麼執行完了再執行下面的 print(6666666666)
python之threading模組簡單講解和執行個體示範