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开发的HTTP库requests详解
Aug 29 Python
利用python修改json文件的value方法
Dec 31 Python
python学生管理系统
Jan 30 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
python数据抓取3种方法总结
Feb 07 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 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
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
浅谈php扩展imagick
2014/06/02 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
js实现聊天对话框
2020/02/08 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python二分查找详解
2015/09/13 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
python实现BackPropagation算法
2017/12/14 Python
快速查询Python文档方法分享
2017/12/27 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
python中rb含义理解
2020/06/18 Python
python从PDF中提取数据的示例
2020/10/30 Python
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
公司授权委托书范本
2014/09/18 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
销售员岗位职责范本
2015/04/11 职场文书
九九重阳节致辞
2015/07/31 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers