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实现对一个完整url进行分割的方法
Apr 29 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
Python Requests库基本用法示例
Aug 20 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
flask框架路由常用定义方式总结
Jul 23 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
Python根据指定文件生成XML的方法
Jun 29 Python
pytorch Dropout过拟合的操作
May 27 Python
python 开心网和豆瓣日记爬取的小爬虫
May 29 Python
python 经纬度求两点距离、三点面积操作
Jun 03 Python
利用Python实现Picgo图床工具
Nov 23 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运行时动态创建函数的方法
2015/03/16 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
javascript 多级checkbox选择效果
2009/08/20 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
原生js实现商品筛选功能
2019/10/28 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
python自动化测试之连接几组测试包实例
2014/09/28 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
对python中dict和json的区别详解
2018/12/18 Python
详解Python正则表达式re模块
2019/03/19 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
华三通信H3C面试题
2015/05/15 面试题
高中运动会广播稿
2014/01/21 职场文书
内勤主管岗位职责
2014/04/03 职场文书
租房协议书范本
2014/04/09 职场文书
高一学生评语大全
2014/04/25 职场文书
詹天佑教学反思
2014/04/30 职场文书
应届生找工作求职信
2014/06/24 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL