python之多線程

來源:互聯網
上載者:User

標籤:tick   font   進程   +=   style   release   形式   color   共用   

多線程是為了同步完成多項任務,通過提高資源效率來提高系統的效率。它是在同一時間完成多項任務的時候實現的。在 Python 中,使用多線程的模組是 threading。其中最常用的是 Thread 類。

import threadingimport timedef coding():    for x in range(3):        print(‘%s正在寫代碼‘ % x)        time.sleep(1)def drawing():    for x in range(3):        print(‘%s正在畫圖‘ % x)        time.sleep(1)def single_thread():    coding()    drawing()def multi_thread():    t1 = threading.Thread(target=coding)    t2 = threading.Thread(target=drawing)    t1.start()    t2.start()if __name__ == ‘__main__‘:    multi_thread()

可以使用 threading.enumerate() 函數來看到當前線程的數量。

 

另外, 也可以使用類的形式來封裝一個線程,這樣,代碼具有更好的擴充性。它是繼承 Threading 類。並且重寫 run 方法。

import threadingimport timeclass CodingThread(threading.Thread):    def run(self):        for x in range(3):            print(‘%s正在寫代碼‘ % threading.current_thread())            time.sleep(1)class DrawingThread(threading.Thread):    def run(self):        for x in range(3):            print(‘%s正在畫圖‘ % threading.current_thread())            time.sleep(1)def multi_thread():    t1 = CodingThread()    t2 = DrawingThread()    t1.start()    t2.start()if __name__ == ‘__main__‘:    multi_thread()

 

多線程全域變數共用的安全問題

因為多線程是在同一個進程中啟動並執行。在進程中的全域變數是可以共用的,這就造成了一個問題,因為線程執行的順序是無序的。有可能會造成資料錯誤。比如以下代碼:

import threadingtickets = 0def get_ticket():    global tickets    for x in range(1000000):        tickets += 1    print(‘tickets:%d‘%tickets)def main():    for x in range(2):        t = threading.Thread(target=get_ticket)        t.start()if __name__ == ‘__main__‘:    main()

  

為瞭解決以上問題,Python 解譯器中引入了鎖機制。當我一個線程使用這個變數的時候,就給它上了一個鎖,別的線程此刻無法訪問這個變數,直到我這個線程使用完後,然後釋放掉鎖。就像我去廁所,關上了門,別人就無法進來使用,直到我開啟門後,別人在能上廁所。鎖的引入是為瞭解決全域變數的安全問題。

 1 import threading 2  3 VALUE = 0 4  5 gLock = threading.Lock() 6  7 def add_value(): 8     global VALUE 9     gLock.acquire()10     for x in range(1000000):11         VALUE += 112     gLock.release()13     print(‘value:%d‘%VALUE)14 15 def main():16     for x in range(2):17         t = threading.Thread(target=add_value)18         t.start()19 20 if __name__ == ‘__main__‘:21     main()

 

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.