Python多线程支持全局变量的共享操作,但是它存在很多问题,先来看以下程序,该程序理论上执行完毕后全局变量g_num的值应该是2000000,但是在实际运行中,结果不足理论值
1 import threading 2 import time 3 4 #定义一个全局变量 5 g_num=0 6 7 def test1(num): 8 global g_num 9 for i in range(num): 10 g_num+=1 11 print("----in test1 g_num=%d----"%g_num) 12 13 def test2(num): 14 global g_num 15 for i in range(num): 16 g_num+=1 17 print("----in test2 g_num=%d----"%g_num) 18 19 def main(): 20 t1=threading.Thread(target=test1,args=(1000000,)) 21 t2=threading.Thread(target=test2,args=(1000000,)) 22 t1.start() 23 t2.start() 24 #等待上面的两个线程执行完毕.... 25 time.sleep(5) 26 print("----in main Thread g_num=%d----"%g_num) 27 28 29 if __name__=="__main__": 30 main() 31 #理论上最后应该输出2000000(1000000+1000000) 32 #但实际上不足2000000
该程序两个线程都具有改变全局变量的功能,主要的语句是 g_num+=1,在计算机内部真正执行的过程中,这一条语句分很多个步骤执行(就好像C++的一条语句要依靠多条汇编语句来翻译),在多线程程序执行的过程中,线程1可能刚执行完第二个步骤:把获取的值+1,就在这个瞬间计算机CPU将程序的执行权给予了线程2,就这么简单的程序执行权的交接,使得全局变量g_num真实值比理论值少了一个1,这也就是多线程程序里全局变量的主要问题。