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 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
Python实现子类调用父类的方法
Nov 10 Python
Python标准库之collections包的使用教程
Apr 27 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
利用python将图片版PDF转文字版PDF
May 03 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
Python PO设计模式的具体使用
Aug 16 Python
python 两个数据库postgresql对比
Oct 21 Python
python中remove函数的踩坑记录
Jan 04 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Python OpenCV实现图像模板匹配详解
Apr 07 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python3数字求和的实例
2019/02/19 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
端口镜像是怎么实现的
2014/03/25 面试题
客服工作职责
2013/12/11 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
安全生产管理责任书
2014/04/16 职场文书
网站创业计划书
2014/04/30 职场文书
出国英文推荐信
2014/05/10 职场文书
冬季施工防火方案
2014/05/17 职场文书
小学教师岗位职责
2015/04/02 职场文书
利用Python实现模拟登录知乎
2022/05/25 Python