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 base64 decode incorrect padding错误解决方法
Jan 08 Python
python Django批量导入数据
Mar 25 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
Python探索之创建二叉树
Oct 25 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
Flask框架工厂函数用法实例分析
May 25 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
python实现登录与注册系统
Nov 30 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
URL Rewrite的设置方法
2007/01/02 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
thinkphp分页实现效果
2016/10/13 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
Seajs源码详解分析
2019/04/02 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
Python判断直线和矩形是否相交的方法
2015/07/14 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
神经网络python源码分享
2017/12/15 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
Python容器类型公共方法总结
2020/08/19 Python
python 进程池pool使用详解
2020/10/15 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
物流创业计划书
2014/02/01 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
团员年度个人总结
2015/02/26 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
Python必备技巧之字符数据操作详解
2022/03/23 Python