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


  簡介:

對於Python2而言,對於一個全局變量,你的函數里如果只使用到了它的值,而沒有對其賦值(指a = XXX這種寫法)的話,就不需要聲明global。

相反,如果你對其賦了值的話,那么你就需要聲明global。

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

若多個線程或進程同時操作這一變量可能會導致搶占資源的現象,變量不能按照預定的邏輯進行操作,這時,在改變變量前需要對變量加互斥鎖,操作完成后釋放互斥鎖。

題外話:

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

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

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

 

  多線程使用互斥鎖Demo :

'''
    多線程操作全局變量 使用互斥鎖
    重點:聲明一個全局互斥鎖
'''
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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM