簡介:
對於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()
