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中使用列表生成式的教程
Apr 27 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
tensorflow实现softma识别MNIST
Mar 12 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
Python进程池Pool应用实例分析
Nov 27 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
python 实现定时任务的四种方式
Apr 01 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
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
python getpass实现密文实例详解
2019/09/24 Python
Python如何实现的二分查找算法
2020/05/27 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
为什么需要版本控制
2016/10/28 面试题
大一自我鉴定范文
2013/10/04 职场文书
主持人演讲稿
2014/05/13 职场文书
火锅店的活动方案
2014/08/15 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
校车司机安全责任书
2015/05/11 职场文书
情况说明书怎么写
2015/10/08 职场文书
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS
python实现局部图像放大
2021/11/17 Python