Python 共享变量加锁、释放详解


Posted in Python onAugust 28, 2019

一、共享变量

共享变量:当多个线程访问同一个变量的时候。会产生共享变量的问题。

例子:

import threading
sum = 0
loopSum = 1000000
def myAdd():
  global sum, loopSum
for i in range(1, loopSum):
  sum += 1
def myMinu():
  global sum, loopSum
for i in range(1, loopSum):
  sum -= 1
if __name__ == "__main__":
  print("Dont,,,,,,,{0}".format(sum))
t1 = threading.Thread(target = myAdd, args = ())
t2 = threading.Thread(target = myMinu, args = ())
t1.start()
t2.start()
t1.join()
t2.join()
print("Done,,,,,,{0}".format(sum))

Python 共享变量加锁、释放详解

正如上面的结果可以看出:并不是我们期望的0,而是-286705,这就是因为我们共享变量了,同时对变量进行了操作,程序并不是原子的。

2.解决方案:使用“锁”,“信号灯”

(1)锁lock:是一个标志,表示一个线程在占用一些资源。

使用方式:先上锁,然后使用共享资源,放心的使用,最后再释放锁,即释放了这个变量。

锁哪个:哪个资源需要共享,那么就锁谁

import threading
sum = 0
loopSum = 1000000
lock = threading.Lock()
# 先生成一个锁的实例
def myAdd():
  global sum, loopSum
for i in range(1, loopSum):
  lock.acquire()# 这里申请了一把锁
sum += 1
lock.release()# 注意千万不要忘了释放锁
def myMinu():
  global sum, loopSum
for i in range(1, loopSum):
  lock.acquire()
sum -= 1
lock.release()
if __name__ == "__main__":
  print("Done,,,,,,,{0}".format(sum))
t1 = threading.Thread(target = myAdd, args = ())
t2 = threading.Thread(target = myMinu, args = ())
t1.start()
t2.start()
t1.join()
t2.join()
print("Done,,,,,,{0}".format(sum))

Python 共享变量加锁、释放详解

正如我们所预料的加减的顺序无所谓,但最后是零和游戏,但是上面的那个例子,都也是加减顺序无所谓,但是有一点要知道会存在同时对变量的内存使用的情况,这就存在内存被错写的风险,所以最后结果不对,上面的不是零和游戏。

(2)线程的安全问题:

如果一个资源、变量,他对于多线程来讲,不用加锁,也不会引起任何问题,则称为线程安全;线程不安全的变量类型:list\set\dict;线程安全的变量类型:queue

二、源码

d25_1_shared_variable_and_lock.py

https://github.com/ruigege66/Python_learning/blob/master/d25_1_shared_variable_and_lock.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python算法应用实战之栈详解
Feb 04 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
《与孩子一起学编程》python自测题
May 27 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
python实现登录密码重置简易操作代码
Aug 14 Python
Python socket非阻塞模块应用示例
Sep 12 Python
Python Collatz序列实现过程解析
Oct 12 Python
tensorflow之并行读入数据详解
Feb 05 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 Python
Python实现聚类K-means算法详解
Jul 15 Python
Python使用百度api做人脸对比的方法
Aug 28 #Python
linux下python中文乱码解决方案详解
Aug 28 #Python
Kears+Opencv实现简单人脸识别
Aug 28 #Python
解决python 文本过滤和清理问题
Aug 28 #Python
解决Python对齐文本字符串问题
Aug 28 #Python
python+jinja2实现接口数据批量生成工具
Aug 28 #Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 #Python
You might like
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
python和ruby,我选谁?
2017/09/13 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
2014教师党员个人自我评议
2014/09/20 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
创业计划书之农家乐
2019/10/09 职场文书
java中如何截取字符串最后一位
2022/07/07 Java/Android
redis lua限流算法实现示例
2022/07/15 Redis