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爬虫之抓取百度贴吧代码分享
Nov 06 Python
python实现在windows下操作word的方法
Apr 28 Python
python基于socket实现网络广播的方法
Apr 29 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python zip()函数的使用示例
Sep 23 Python
python中Pexpect的工作流程实例讲解
Mar 02 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原理之异常机制深入分析
2010/08/08 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
php中switch语句用法详解
2015/08/17 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
原生JS实现留言板
2020/03/26 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
python实现彩票系统
2020/06/28 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Python中的__init__作用是什么
2020/06/09 Python
《哪吒闹海》教学反思
2014/02/28 职场文书
少先队学雷锋活动总结范文
2014/03/09 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
镇政府副镇长群众路线专题民主生活会对照检查材料
2014/09/19 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
人民检察院起诉书
2015/05/20 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
方法汇总:Python 安装第三方库常用
2022/04/26 Python