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脚本实现DNSPod DNS动态解析域名
Feb 14 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
python实现聚类算法原理
Feb 12 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
python列表推导式操作解析
Nov 26 Python
用 Python 制作地球仪的方法
Apr 24 Python
Python Json数据文件操作原理解析
May 09 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
基于 Python 实践感知器分类算法
Jan 07 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+ajax实现图片文件上传功能实例
2014/06/17 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php cli配置文件问题分析
2015/10/15 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
python进程和线程用法知识点总结
2019/05/28 Python
python命令行工具Click快速掌握
2019/07/04 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
Django 实现图片上传和下载功能
2020/12/31 Python
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
Ruby如何定义一个类
2012/10/08 面试题
物流管理专业毕业生自荐信
2014/03/04 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
学生请假条
2014/04/11 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
自我查摆剖析材料
2014/10/11 职场文书
成绩报告单家长评语
2014/12/30 职场文书
2015年护士节慰问信
2015/03/23 职场文书
社区党支部承诺书
2015/04/29 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
2016年五一促销广告语
2016/01/28 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
Go语言入门exec的基本使用
2022/05/20 Golang
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL