1. 程式人生 > >python之多線程

python之多線程

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