python之多線程
阿新 • • 發佈:2018-09-08
value draw pre oba ont single div 提高 全局變量
多線程是為了同步完成多項任務,通過提高資源效率來提高系統的效率。它是在同一時間完成多項任務的時候實現的。在 Python 中,使用多線程的模塊是 threading。其中最常用的是 Thread 類。
import threading import time def 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 threading import time class 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 threading tickets = 0 def 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 += 1 12 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之多線程