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 获取文件列表(或是目录例表)
Mar 25 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
浅析python协程相关概念
Jan 20 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
Python用户自定义异常的实现
Dec 25 Python
python 离散点图画法的实现
Apr 01 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/03/22 PHP
header跳转和include包含问题详解
2012/09/08 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
php5与php7的区别点总结
2019/10/11 PHP
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
JQuery球队选择实例
2015/05/18 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中的并发编程实例
2014/07/07 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
用python解压分析jar包实例
2020/01/16 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
项目投资合作意向书
2014/07/29 职场文书
集体生日活动方案
2014/08/18 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
MySQL8.0.18配置多主一从
2021/06/21 MySQL
Redis RDB技术底层原理详解
2021/09/04 Redis
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers