python之多線程

來源:互聯網
上載者:User

標籤:修改   通訊   join()   使用   說明   run   沒有   rgs   release   

一:線程

       線程(有時候稱為輕量級進程),線程包括開始、執行順序和結束三部分。它有一個指令指標,用於記錄當前啟動並執行上下文。當其他線程運行時,它可以被搶佔(中斷)和臨時掛起(也稱為睡眠)--這種做法叫做讓步

       一個進程中的各個線程與主線程共用同一片資料空間,因此相比與獨立的進程而言,線程間的資訊共用和通訊更加容易。線程一般是以並發方式執行的,正是由於這種並行和資料共用機制,使得多任務間的協作成為可能。當然,在單核CPU系統中,因為真正的並發是不可能的,所以線程的執行實際上是這樣規劃的:每個線程運行一小會兒,然後讓步給其他線程(再次排隊等待更多的CPU時間)。在整個進程的執行的過程中,每個線程執行他自己特定任務,在必要時和其他線程進行結果通訊。

      當然,這種共用並不是沒有風險的。如果兩個或多個線程訪問同一片資料,由於資料訪問順序不同,可能導致結果不一致,這種情況通常稱為競態條件。

      另外,線程無法給予公平的執行時間。

     儘管python解譯器中可以運行多個線程,但是在任意給定時刻只有一個線程會被解譯器執行

二:使用線程的第一種方式:

1 import time2 from threading import Thread3 4 def test():5     print(‘-----多線程-------‘)6     time.sleep(1)7 for i in range(5):8     t = Thread(target=test) #建立一個線程,參數是要執行的函數9     t.start() #啟動線程
t.join()# 保證等待子線程運行完再執行後續的主線程

三:使用線程的第二種方式:

 1 #使用多線程的第二種方式(建立一個類繼承Thread類,重寫run()方法) 2 import threading 3 import time 4 class MyThread(threading.Thread): 5     def run(self): 6         for i in range(5): 7             print(‘-----使用多線程的第二種方式------‘) 8             time.sleep(1) 9 if __name__ == ‘__main__‘:10     m = MyThread()11     m.start()

四:加互斥鎖解決多線程之間共用資料被修改出現的異常資料

 說明:

            當多個線程幾乎同時訪問一個共用資料時,需要進行同步控制

線程同步能夠保證多個安全執行緒訪問競爭資源,最簡單的同步機制就是引入互斥鎖。

互斥鎖為資源引入一個狀態:鎖定/非鎖定

某個線程要更改共用資料時,先將其鎖定,此時資源的狀態為”鎖定“,其他線程不能更改;直到改線程釋放資源,將資源狀態變成”非鎖定“,其他線程才能再次鎖定改資源,互斥鎖保證了每次只有線程進行寫入操作,從而保證了多線程情況下資料的準確性。

範例程式碼:

 1 from threading import Thread,Lock 2 num = 0 3 def test1(lock): 4     global num 5     lock.acquire() #上鎖 6     for i in range(1000000): 7         num += 1 8     lock.release() #釋放鎖(解鎖) 9     print(‘----test1---%d‘%num)10 def test2(lock):11     global num12     lock.acquire()13     for i in range(1000000):14         num += 115     lock.release()16     print(‘-----test2-----%d‘%num)17 def main():18     lock =Lock()#初始化一個互斥鎖對象19     t1 = Thread(target=test1,args=(lock,)) #建立一個多線程20     t1.start()21     t1.join()22     t2 = Thread(target=test2,args=(lock,))23     t2.start()24     t2.join()#等待子線程執行完成後再繼續主線程25     print(num)26 27 if __name__ == ‘__main__‘:28     main()

運行結果:

----test1---1000000-----test2-----20000002000000

 

python之多線程

聯繫我們

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