python之threading模組簡單講解和執行個體示範

來源:互聯網
上載者:User

標籤:多個   整數   上下   結束   釋放   構造   解鎖   操作   基本   

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模組簡單講解和執行個體示範

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.