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为tornado添加recaptcha验证码功能
Feb 26 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
python字典键值对的添加和遍历方法
Sep 11 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
对pandas中to_dict的用法详解
Jun 05 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
解决python3 pika之连接断开的问题
Dec 18 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
Python中SQLite如何使用
May 27 Python
python 基于opencv实现高斯平滑
Dec 18 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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
js更优雅的兼容
2010/08/12 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
电子商务应届生求职信
2013/11/16 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
督导岗位职责
2015/02/04 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
2015年加油站工作总结
2015/05/13 职场文书
七年级语文教学反思
2016/03/03 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android