python版本的读写锁操作方法


Posted in Python onApril 25, 2016

本文实例讲述了python版本的读写锁操作方法。分享给大家供大家参考,具体如下:

最近要用到读写锁的机制,但是python2.7的自带库里居然木有.
网上讲读写锁的例子众多,但是原理简单,代码明晰的却不多见, 索性自己写个.

读写锁一般用于多个读者,1个或多个写者同时访问某种资源的时候。多个读者之间是可以共享资源的,但是写者与读者之间,写者与写者之间是资源互斥的。

这也就是说同时可以有多个读者或一个写者处于工作状态。

细分下来,读写锁可以分为三类,读者优先,写者优先和公开策略。

第一种,读者优先,
目的是保证读者可以尽可能的不需要等待就获取资源。
实现的要点,写者方面比较简单,只需要一个锁就能控制是否可写。
读者方面,在第一个读者到来的时候就要阻止写者,最后一个读者离开之后再开放写者。这里就存在一个读者计数器的问题,这个计数器是需要在各读者之间共享的,所以需要一个额外的锁来确保该计数器的加减操作的原子性。

实现代码:

定义一个类RWLock,并作简单的初始化

import threading
class RWLock(object):
  def __init__(self):
    self.rlock = threading.Lock()
    self.wlock = threading.Lock()
    self.reader = 0

写者锁

def write_acquire(self):
  self.wlock.acquire()
def write_release(self):
  self.wlock.release()

读者锁

def read_acquire(self):
  self.rlock.acquire()
  self.reader += 1
  if self.reader == 1:
    self.wlock.aquire()
  self.rlock.release()
def read_release(self):
  self.rlock.acquire()
  self.reader -= 1
  if self.reader == 0:
    self.wlock.release()
  self.rlock.release()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python栈类实例分析
Jun 15 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
Python实现查看系统启动项功能示例
May 10 Python
Python get获取页面cookie代码实例
Sep 12 Python
Python Django框架实现应用添加logging日志操作示例
May 17 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
pytorch 实现打印模型的参数值
Dec 30 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
Python虚拟环境venv用法详解
May 25 Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
Apr 27 Python
Python简单实现enum功能的方法
Apr 25 #Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 #Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 #Python
Python 中的 else详解
Apr 23 #Python
Python 探针的实现原理
Apr 23 #Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 #Python
Linux 发邮件磁盘空间监控(python)
Apr 23 #Python
You might like
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
django如何自己创建一个中间件
2019/07/24 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
python实现人机五子棋
2020/03/25 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
易程科技软件测试笔试
2013/03/24 面试题
汇源肾宝广告词
2014/03/20 职场文书
创先争优演讲稿
2014/09/15 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
Redis集群的关闭与重启操作
2021/07/07 Redis
CSS基础详解
2021/10/16 HTML / CSS