python多线程-共享全局变量
多线程-共享全局变量
多线程-共享全局变量
import threading
import time
g_num = 200
def test1():
global g_num
for i in range(5):
g_num += 1
print("--test1, g_num = %d--" % g_num)
def test2():
global g_num
print("--test2, g_num = %d--" % g_num)
if __name__ == "__main__":
print("--执行线程之前, g_num = %d--" % g_num)
t1 = threading.Thread(target=test1)
t1.start()
# 延时一会儿,确保线程t1中的事情能做
time.sleep(1)
t2 = threading.Thread(target=test2)
t2.start()
运行结果:
--执行线程之前, g_num = 200--
--test1, g_num = 205--
--test2, g_num = 205--
在上面的程序中。test1函数循环五次,每次将g_num全局变量加一并打印g_num的值,在test2函数中仅仅打印g_num的值。在t1线程中执行test1函数,在t2线程中执行test2函数,并在执行t2线程之前,延时一秒中来保证t1线程执行完毕。
列表当作实参传递到线程中
import threading
import time
def test1(nums):
nums.append(54)
print("--test1, nums=", nums)
g_nums = [1, 8, 9]
def test2(nums):
# 确保test1中执行完毕
time.sleep(1)
print("--test2, nums=", nums)
if __name__ == "__main__":
t1 = threading.Thread(target=test1, args=(g_nums,))
t1.start()
t2 = threading.Thread(target=test2, args=(g_nums,))
t2.start()
运行结果:
--test1, nums= [1, 8, 9, 54]
--test2, nums= [1, 8, 9, 54]
总结
- 在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据
- 缺点就是,线程是对全局变量随意修改可能造成多线程之间对全局变量的混乱(即线程非安全)
多线程-共享全局变量问题
多线程开发可能遇到的问题
假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20。
但是由于是多线程同时操作,有可能出现下面情况:
- 在g_num=0时,t1取得g_num=0。此时系统把t1调度为”sleeping”状态,把t2转换为”running”状态,t2也获得g_num=0
- 然后t2对得到的值进行加1并赋给g_num,使得g_num=1
- 然后系统又把t2调度为”sleeping”,把t1转为”running”。线程t1又把它之前得到的0加1后赋值给g_num。
- 这样导致虽然t1和t2都对g_num加1,但结果仍然是g_num=1
测试1
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
g_num += 1
print("--test1, g_num = %d--" % g_num)
def test2(num):
global g_num
for i in range(num):
g_num += 1
print("--test2, g_num = %d--" % g_num)
if __name__ == "__main__":
print("--创建线程之前, g_num = %d--" % g_num)
t1 = threading.Thread(target=test1, args=(100,))
t1.start()
t2 = threading.Thread(target=test2, args=(100,))
t2.start()
while len(threading.enumerate()) != 1:
time.sleep(1)
print("最终结果为:g_num=%d" % g_num)
运行结果:
--创建线程之前, g_num = 0--
--test1, g_num = 100--
--test2, g_num = 200--
最终结果为:g_num=200
测试2
在测试1的基础上,向test1和test2方法传入的参数的值为:9999999
运行结果:
--创建线程之前, g_num = 0--
--test1, g_num = 13554011--
--test2, g_num = 13571206--
最终结果为:g_num=13571206
很显然,期待的结果为:9999999 + 9999999 = 19999998,而运行结果为:13571206。
python多线程-共享全局变量的更多相关文章
- 一起学Python: 多线程-共享全局变量问题
多线程-共享全局变量问题 多线程开发可能遇到的问题 假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20. 但是 ...
- 一起学Python:多线程-共享全局变量
多线程-共享全局变量 from threading import Thread import time g_num = 100 def work1(): global g_num for i in r ...
- python 多线程共享全局变量的问题
多线程都是在同一个进程中运行的.因此在进程中的全局变量所有线程都是可共享的. 这就造成了一个问题,因为线程执行的顺序是无序的.有可能会造成数据错误. 直白理解:也就是多线程执行的时候,同时对一个全局变 ...
- 7.Python网络编程_多线程共享全局变量问题
Python多线程支持全局变量的共享操作,但是它存在很多问题,先来看以下程序,该程序理论上执行完毕后全局变量g_num的值应该是2000000,但是在实际运行中,结果不足理论值 import thre ...
- Python 中多线程共享全局变量的问题
写在前面不得不看的一些P话: Python 中多个线程之间是可以共享全局变量的数据的. 但是,多线程共享全局变量是会出问题的. 假设两个线程 t1 和 t2 都要对全局变量g_num (默认是0)进行 ...
- python编程系列---多线程共享全局变量出现了安全问题的解决方法
多线程共享全局变量出现了安全问题的解决方法 当多线程共享全局变量时,可能出现安全问题,解决机制----互斥锁:即在在一段与全局变量修改相关的代码中,假设一个时间片不足以完成全局变量的修改,就在这段代码 ...
- 多任务-python实现-多线程共享全局变量(2.1.3)
@ 目录 1.全局变量的修改 2.全局变量在多线程中的共享 3.多线程可能遇到的问题 1.全局变量的修改 代码实现 num = 100 nums = [11,22] def test(): globa ...
- python 多进程共享全局变量之Manager()
Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和A ...
- python多线程详解
目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 二.线程实现 threading模块 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 互斥锁 递归锁 信号量 ...
随机推荐
- 背水一战 Windows 10 (117) - 后台任务: 后台下载任务
[源码下载] 背水一战 Windows 10 (117) - 后台任务: 后台下载任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下载任务 示例演示 uwp 的后台下 ...
- 背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议
[源码下载] 背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议 作者:webabcd 介绍背水一战 Windows 10 之 关联启动 关联指定的文件类型 ...
- react-native 项目初始化
react-native 项目初始化 搭建java,android,node环境 http://www.cnblogs.com/morang/p/react-native-java-build.htm ...
- 公司项目接触到了FormData,总结一下
Javascript FormData() 对象! 1.创建 var formData = new FormData(); 2.如果有form对象 则先获取form表单 然后初始化时直接加入进去 eg ...
- AngularJS 四大特性
1.模块化 2.双向数据绑定 3.依赖注入 4.mvc模式
- Drools规则引擎入门指南(二)
本篇博客主要讲解Drools常用的属性以及函数 属性 首先我们在resources\rules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTes ...
- Go语言复制文件
需要使用io包的Copy方法 package main import ( "fmt" "io" "os" ) //自己编写一个函数,接收两个 ...
- 第59节:Java中的html和css语言
欢迎到我的简书查看我的文集 前言: HTML 英文: HyperText Markup Language内容 html是超文本标记语言,是网页语言的基础知识,html是通过标签来定义的语言,所有代码都 ...
- Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器
迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...
- 微信APP支付,支付宝APP支付demo
最近公司新开发的APP中,需要集成微信支付和支付宝支付,2个平台申请的都是APP支付.这是个人第一次单独的,完整的做完2个平台的支付. 这里我主要用到了2个接口:支付接口,订单查询接口,虽然2个平台的 ...