zoukankan      html  css  js  c++  java
  • 7.Python网络编程_多线程共享全局变量问题

       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,这也就是多线程程序里全局变量的主要问题。

  • 相关阅读:
    oracle函数 MAX([distinct|all]x)
    oracle函数 MAX([distinct|all]x)
    oralce函数 count(*|[distinct|all]x)
    oracle函数 VARIANCE([distinct|all]x)
    oralce函数 STDDEV([distinct|all]x)
    oracle函数 SUM([distinct|all]x)
    oralcle函数 AVG([distinct|all]x)
    oracle函数 lag()和lead()
    oracle函数 ROW_NUMBER()
    Linux性能测试 netstat命令
  • 原文地址:https://www.cnblogs.com/NiBosS/p/11963075.html
Copyright © 2011-2022 走看看