Python多线程支持全局变量的共享操作,但是它存在很多问题,先来看以下程序,该程序理论上执行完毕后全局变量g_num的值应该是2000000,但是在实际运行中,结果不足理论值

 import threading
import time #定义一个全局变量
g_num=0 def test1(num):
global g_num
for i in range(num):
g_num+=1
print("----in test1 g_num=%d----"%g_num) def test2(num):
global g_num
for i in range(num):
g_num+=1
print("----in test2 g_num=%d----"%g_num) def main():
t1=threading.Thread(target=test1,args=(1000000,))
t2=threading.Thread(target=test2,args=(1000000,))
t1.start()
t2.start()
#等待上面的两个线程执行完毕....
time.sleep(5)
print("----in main Thread g_num=%d----"%g_num) if __name__=="__main__":
main()
#理论上最后应该输出2000000(1000000+1000000)
#但实际上不足2000000

  该程序两个线程都具有改变全局变量的功能,主要的语句是 g_num+=1,在计算机内部真正执行的过程中,这一条语句分很多个步骤执行(就好像C++的一条语句要依靠多条汇编语句来翻译),在多线程程序执行的过程中,线程1可能刚执行完第二个步骤:把获取的值+1,就在这个瞬间计算机CPU将程序的执行权给予了线程2,就这么简单的程序执行权的交接,使得全局变量g_num真实值比理论值少了一个1,这也就是多线程程序里全局变量的主要问题。

7.Python网络编程_多线程共享全局变量问题的更多相关文章

  1. 8.Python网络编程_多线程死锁

    死锁:指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死 ...

  2. python编程系列---多线程共享全局变量出现了安全问题的解决方法

    多线程共享全局变量出现了安全问题的解决方法 当多线程共享全局变量时,可能出现安全问题,解决机制----互斥锁:即在在一段与全局变量修改相关的代码中,假设一个时间片不足以完成全局变量的修改,就在这段代码 ...

  3. Python网络编程_抓取百度首页代码(注释详细)

    1 #coding=utf-8 2 #网络编程 3 4 #客户端建立socket套接字 5 #引入socket模块 6 import socket 7 #实例化一个套接字,2个参数分别是: IPV4. ...

  4. 6.Python网络编程_全局变量基础

    变量作用域: 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量.全局变量所有作用域都可用,局部变量只能在本函数可用,变量的使用顺序是,局部变量 > 全局变量, 也就是说:优 ...

  5. 5.Python网络编程_通过继承实现多线程

    import threading import time #继承形式的多线程,适合于程序比较复杂的情况 class MyThread(threading.Thread): #t.start()会调用r ...

  6. 4.Python网络编程_一般多线程创建步骤

    #该程序使用命令行执行,IDE执行会有其他线程附加 import threading import time #初始化一个线程 #t=threading.Thread(target=func) #fu ...

  7. 【Python网络编程】多线程聊天软件程序

    课程设计的时候制作的多线程聊天软件程序 基于python3.4.3 import socket import pickle import threading import tkinter import ...

  8. 3.Python网络编程_多任务问题抛出

    #单线程程序 import time def sing(): """唱歌5秒钟""" for i in range(5): print(&q ...

  9. 一起学Python: 多线程-共享全局变量问题

    多线程-共享全局变量问题 多线程开发可能遇到的问题 假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20. 但是 ...

随机推荐

  1. netperf 网络测试工具

    软件介绍: netperf是惠普公司开源的一款针对网络性能的测试工具,主要基于TCP或UDP的传输.根据应用的不同,可以进行批量数据传输(bulk data transfer)模式和请求/应答(req ...

  2. Day8 - Python基础8 异常处理、反射、单例模式

    本节内容: 1:异常处理 2:反射 3:单例模式 1.异常处理  1.异常简介 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户 ...

  3. 【转】Cookie和Session和Cache

    1 Cookie和Session Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实 ...

  4. Java解析XML字符串,取出其中<aaaa><![CDATA[(XXX)]]></aaa>里面的XXX值,也可以使用xml解析的其他方式,这是最简单的字符串解析

    直接贴一段业务代码,这段代码是解析请求返回的xml格式字符串,为了取出其中的值便于下一步的使用. @RequestMapping(value="/search",produces ...

  5. acwing 110 防晒

    https://www.acwing.com/problem/content/description/112/ 有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的 ...

  6. 改编《OI抄》

    最近经历的事情比较多,网上常常流传着<锦鲤抄>修改版,于是就再修改了修改,就能唱起来了. 算是一种情怀吧. 请欣赏: OI抄 作词:某些dar佬 FYHSSGSS ssdfzhyf 作曲: ...

  7. 洛谷 P5658 括号树

    \(50pts\) #include <cstdio> #include <cstring> #include <iostream> #include <al ...

  8. vue中\$refs、\$emit、$on的使用场景

    1.$emit的使用场景 子组件调用父组件的方法并传递数据注意:子组件标签中的时间也不区分大小写要用“-”隔开 子组件: <template> <button @click=&quo ...

  9. js获取url参数值的方法总结

    1.方式一:通过字符串截取的方式获取参数值: 1).函数一:获取URL中的参数名及参数值的集合 /** * [获取URL中的参数名及参数值的集合] * 示例URL:http://htmlJsTest/ ...

  10. 【mysql报错】[Err] 1248 - Every derived table must have its own alias

    当我运行一条联合查询的sql语句时报如下错误: [Err] 1248 - Every derived table must have its own alias,大概意思是每一张派生表必须要有自己的别 ...