简单探讨一下python线程锁
作者:真的不能告诉你我的名字 发布时间:2021-03-24 12:06:54
为什么需要线程锁
当我们访问一些特殊的数据时,需要保证该数据的原子性,比如: 文章的阅读量、文章的点赞量等。我们必须要确保这些共享数据必须是原子性的,否则的话,多线程同时访问的时候,可能会出现异常情况,什么是原子性呢?原子性是指一个操作是不可能被中途中断的,要不全部完成,要不没有完成,这么说,可能不理解,下面举个例子来说明一下原子性的重要性:
比如我们写一个程序,来模拟10个人点赞,最后输出阅读量的值,代码如下:
代码初看好像没什么问题,反正核心点就是阅读量+1,当运行就,就出现问题了,
上述代码,运行了5次,出现了5次不一样的结果。这就是出现了竞争,所以我们需要加一个锁,来确保该阅读量函数的原子性。
线程锁使用
python
中的threading
模块,提供的锁就只有一种,我们使用Lock
定义锁,例如:
Lock = threading.Lock()
如果需要对资源进行上锁的话,使用acquire
方法即可,例如:
Lock.acquire()
如果需要对资源进行解锁的话,使用release
方法即可,例如:
Lock.release()
除此之外,threading
模块还提供了RLock
可重入锁,可重入锁的作用和普通锁一样,用于保护资源,以保证并发访问不会出现问题,但是与普通锁不同的是,可重入锁允许同一个线程在持有锁的情况下多次获取该锁而不会发生死锁。但是在持有多少次锁,也必须释放多少次锁,否则会出现问题。
案例说明线程锁
上述我们介绍了线程锁,这里将addReaderCount
进行加锁和解锁的操作,代码如下:
上述代码在源代码的基础上,在最开始使用Lock
定义了一个锁,而后再函数开始之前进行一个加锁acquire()
,这样的话,其他函数在执行的时候,发现这个是已经锁住了的,所以会等待,等待解锁后(releas()
)再进行该函数,而函数又会加锁,如此往复,能够确保在同一时刻,addReaderCount
函数只执行一次。
执行程序结果为:
可以发现,这次的结果阅读量的值终于符合我们的预期了。
实现一个读写锁
在python
中,原生是没有读写锁的,只能借助第三方来实现,这里我们可以实现一个简单的读写锁。
在写之前,我们需要先了解下读写锁的作用到底是什么?读写锁将资源拆分为读和写2种操作,读锁允许多个线程同时读取共享资源,提高并发性能。但是当需要修改共享资源的时候,只能允许一个线程修改该共享资源,并且在修改完毕前,不允许读请求,以便造成数据不一致。所以操作完毕后,开放读请求。
这里为了实验,写了一个最简单的读写锁,安全性和效率都得不到保证,若想使用读写锁,可以使用第三方的读写锁。
我们自己写的读写锁代码如下:
上述代码,我们实现了一个读写锁类RWLock
,其中有4个方法,分别为:
writeLock
:写锁writeUnlock
:释放写锁readLock
:读锁readUnlock
: 释放读锁
由于读锁可以同一时刻被调用,所以我们使用的变量readCount
来定义的,等需要读锁的是,readCount
会+1,可以一直调用下去,而如果需要写锁的时候,这里是先将写锁变量Locked
定义为True
,若此时再次调用读写,会让其等待,而在写锁中,会等待读锁读取完毕后(readCount
为0的时候),再进行写锁的请求。写锁执行完毕后,会将Locked
给重置为False
。
这里写一个小的调用方法来调用一下:
上述代码,在reads
和writes
方法中,分表调用我们之前定义的读锁和写锁,代码中定义了9个线程,分别是调用了6次读,以及3次写。
效果我们来看下:
从上述结果中,我们不难发现,在没有写锁情况下,我们使用读锁,可以访问同一资源,当使用写锁后,读锁会暂停,当写锁执行完毕后,读锁才会继续批量执行。
来源:https://juejin.cn/post/7224874901815492668
猜你喜欢
- 问题:windows环境下新建或编辑文本文件,保存时会在头部加上BOM。使用ftp上传到linux下,在执行时第一行即报错。以下方法可以去除
- Python 数字类型Python 中有三种数字类型:intfloatcomplex为变量赋值时,将创建数值类型的变量:实例x = 10 &
- 装饰器信号与槽所谓装饰器信号与槽,就是通过装饰器的方法来定义信号与槽函数,具体的使用方法如下@PyQt5.QtCore.pyqtSlot(参
- 常用的重定向方式有: 301 redirect, 302 redirect 与 meta fresh:301 redirect: 301代表
- 以控制抖音app滑动并获取抖音短视频发布者昵称和点赞数等信息为例:1. 安装appium-python-client模块并启动已安装好的环境
- 在过去的几十年里,机器学习对世界产生了巨大的影响,而且它的普及程度似乎在不断增长。最近,越来越多的人已经熟悉了机器学习的子领域,如神经网络,
- 本文实例讲述了Python使用Matplotlib实现雨点图动画效果的方法。分享给大家供大家参考,具体如下:关键点win10安装ffmpeg
- 许多人在数据科学、机器学习、web开发、脚本编写和自动化等领域中都会使用Python,它是一种十分流行的语言。Python流行的部分原因在于
- 最近写了两个管理后台的前端页面,其中有一个管理后台,左侧菜单导航和右侧内容页是两个iframe,需求是,点击上面的主导航时,左侧iframe
- 可以在Mac OS X 10.2.x(“Jaguar”)和以上版本上Mac OS X使用二进制安装软
- 你知道(X)HTML中最多余的标签中是什么吗?在我看来就是这个<a>标签,不错,就是每个网站使用最多的超级链接标签<a&g
- 1. txt文件(1) 单位矩阵即主对角线上的元素均为1,其余元素均为0的正方形矩阵。在NumPy中可以用eye函数创建一个这样的二维数组,
- 自己写的方法,适用于linux,#!/usr/bin/python#coding=utf-8import sysimport os, os.
- 将Python数据类型转换为其他代码格式叫做(序列化),而json就是在各个代码实现转换的中间件。序列化要求:1. 只能有int,str,b
- 获得当前机器的名字:def hostname(): sy
- 本文实例讲述了Python使用matplotlib绘制三维参数曲线操作。分享给大家供大家参考,具体如下:一 代码import matplot
- asp之家注:长文章分页算是asp编程中一个比较经典单位问题,怎么分页,什么时候分页.方法挺多,有的是人为的加入分页标志,有的是程序自动加分
- 问题:有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另
- 前言gif图就是动态图,它的原理和视频有点类似,也是通过很多静态图片合成的.本篇文章主要介绍,如何利用Python快速合成gif图,主要利用
- vim有各种强大的插件,这不仅归功于其提供的用来编写插件的脚本语言vimL,还得益于它良好的接口实现,从而支持python等语言编写插件。当