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安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
Django实现组合搜索的方法示例
Jan 23 Python
python+mysql实现学生信息查询系统
Feb 21 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
python requests使用socks5的例子
Jul 25 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
Python 线程池模块之多线程操作代码
May 20 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实现处理输入转义字符的代码
2015/11/08 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
python求斐波那契数列示例分享
2014/02/14 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
selenium如何定位span元素的实现
2021/01/13 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
摄影助理岗位职责
2014/02/07 职场文书
环保建议书300字
2014/05/14 职场文书
民间借贷借条范本
2015/05/25 职场文书
迎新生晚会主持词
2015/06/30 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL