『Python』 多線程 共享變量的實現

  簡介:python

對於Python2而言,對於一個全局變量,你的函數裏若是隻使用到了它的值,而沒有對其賦值(指a = XXX這種寫法)的話,就不須要聲明global。多線程

相反,若是你對其賦了值的話,那麼你就須要聲明global。函數

聲明global的話,就表示你是在向一個全局變量賦值,而不是在向一個局部變量賦值。ui

若多個線程或進程同時操做這一變量可能會致使搶佔資源的現象,變量不能按照預約的邏輯進行操做,這時,在改變變量前須要對變量加互斥鎖,操做完成後釋放互斥鎖。spa

題外話:線程

GIL(Global Interpreter Lock) 全局解釋器鎖,致使任一時刻只能有一個線程使用解釋器,當用於 IO 密集型任務時,IO 期間線程會釋放解釋器。blog

在 CPU 計算繁忙的任務重 不建議使用多線程,在非 CPU繁忙型任務中建議使用多線程。進程

順便說下使用多進程的好處:徹底並行,無 GIL 的限制,可充分利用多 CPU 多核的環境。資源

 

  多線程使用互斥鎖Demo :it

'''
    多線程操做全局變量 使用互斥鎖
    重點:聲明一個全局互斥鎖
'''
import threading
import time

counter = 0
mutex = threading.Lock()

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global counter, mutex
        time.sleep(1);
        if mutex.acquire():
            counter += 1
            print "I am %s, set counter:%s" % (self.name, counter)
            mutex.release()

if __name__ == "__main__":
    for i in range(0, 100):
        my_thread = MyThread()
        my_thread.start()
相關文章
相關標籤/搜索