简介: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()