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正则表达式匹配ip地址实例
Oct 09 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
Python基础中所出现的异常报错总结
Nov 19 Python
Mac 上切换Python多版本
Jun 17 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
python 执行shell命令并将结果保存的实例
May 11 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
pytorch自定义初始化权重的方法
Aug 17 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
Python3 实现爬取网站下所有URL方式
Jan 16 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使用curl发送json格式数据实例
2013/12/17 PHP
浅析get与post的一些特殊情况
2014/07/28 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
python实现稀疏矩阵示例代码
2017/06/09 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
单位成立周年感言
2014/01/26 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
如何使用SQL Server语句创建表
2022/04/12 SQL Server