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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python for循环中的陷阱详解
Jul 13 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
Python中zip()函数的简单用法举例
Sep 02 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
Python 列表的清空方式
Jan 13 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
浅谈Python中的模块
Jun 10 Python
Python基础教程之输入输出和运算符
Jul 26 Python
使用Python pip怎么升级pip
Aug 11 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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
PHP children()函数讲解
2019/02/03 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
pycharm 使用心得(五)断点调试
2014/06/06 Python
深入了解Python数据类型之列表
2016/06/24 Python
Python如何实现文本转语音
2016/08/08 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
详解Python if-elif-else知识点
2018/06/11 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
基于Python中的yield表达式介绍
2019/11/19 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
高等教育专业自荐信范文
2014/03/26 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
德劲DE1108畅想
2021/04/22 无线电
Python中的min及返回最小值索引的操作
2021/05/10 Python