標籤: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之多線程