python多線程編程(1)

來源:互聯網
上載者:User

標籤:

虛擬機器層面

Python虛擬機器使用GIL(Global Interpreter Lock,全域解譯器鎖)來互斥線程對共用資源的訪問,暫時無法利用多處理器的優勢。

語言層面

在語言層面,Python對多線程提供了很好的支援,Python中多線程相關的模組包括:thread,threading,Queue。可以方便地支援建立線程、互斥鎖、訊號量、同步等特性。

thread:多線程的底層支援模組,一般不建議使用。

threading:對thread進行了封裝,將一些線程的操作對象化,提供下列類:

Thread 線程類

Timer與Thread類似,但要等待一段時間後才開始運行

Lock 鎖原語

RLock 可重新進入鎖。使單線程可以再次獲得已經獲得的鎖

Condition 條件變數,能讓一個線程停下來,等待其他線程滿足某個“條件”

Event 通用的條件變數。多個線程可以等待某個事件發生,在事件發生後,所有的線程都被啟用

Semaphore為等待鎖的線程提供一個類似“等候室”的結構

BoundedSemaphore 與semaphore類似,但不允許超過初始值

Queue:實現了多生產者(Producer)、多消費者(Consumer)的隊列,支援鎖原語,能夠在多個線程之間提供很好的同步支援。提供的類:

Queue隊列

LifoQueue後入先出(LIFO)隊列

PriorityQueue 優先隊列

 

其中Thread類是你主要的線程類,可以建立進程執行個體。該類提供的函數包括:

getName(self) 返回線程的名字

isAlive(self) 布爾標誌,表示這個線程是否還在運行中

isDaemon(self) 返回線程的daemon標誌

join(self, timeout=None) 程式掛起,直到線程結束,如果給出timeout,則最多阻塞timeout秒

run(self) 定義線程的功能函數

setDaemon(self, daemonic)  把線程的daemon標誌設為daemonic

setName(self, name) 設定線程的名字

start(self) 開始線程執行

python的threading.Thread類有一個run方法,用於定義線程的功能函數,可以在自己的線程類中覆蓋該方法。而建立自己的線程執行個體後,通過Thread類的start方法,可以啟動該線程,交給python虛擬機器進行調度,當該線程獲得執行的機會時,就會調用run方法執行線程。

import threadingimport timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I‘m "+self.name+‘ @ ‘+str(i)print msgdef test():for i in range(5):t = MyThread()t.start()if __name__==‘__main__‘:test()

  

執行結果:

I‘m Thread-1 @ 0
I‘m Thread-2 @ 0
I‘m Thread-5 @ 0
I‘m Thread-3 @ 0
I‘m Thread-4 @ 0
I‘m Thread-3 @ 1
I‘m Thread-4 @ 1
I‘m Thread-5 @ 1
I‘m Thread-1 @ 1
I‘m Thread-2 @ 1
I‘m Thread-4 @ 2
I‘m Thread-5 @ 2
I‘m Thread-2 @ 2
I‘m Thread-1 @ 2
I‘m Thread-3 @ 2

從代碼和執行結果我們可以看出,多線程程式的執行順序是不確定的。當執行到sleep語句時,線程將被阻塞(Blocked),到sleep結束後,線程進入就緒(Runnable)狀態,等待調度。而線程調度將自行選擇一個線程執行。上面的代碼中只能保證每個線程都運行完整個run函數,但是線程的啟動順序、run函數中每次迴圈的執行順序都不能確定。
此外需要注意的是:
1.每個線程一定會有一個名字,儘管上面的例子中沒有指定線程對象的name,但是python會自動為線程指定一個名字。
2.當線程的run()方法結束時該線程完成。
3. 無法控制線程發送器,但可以通過別的方式來影響線程調度的方式。

上面的例子只是簡單的示範了建立了線程、主動掛起以及退出線程

 

python多線程編程(1)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.