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使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
Python基础知识_浅谈用户交互
May 31 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
python元组的概念知识点
Nov 19 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
Python龙贝格法求积分实例
Feb 29 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
Python eval函数原理及用法解析
Nov 14 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 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中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
python 数据的清理行为实例详解
2017/07/12 Python
python实现对输入的密文加密
2019/03/20 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Python3的socket使用方法详解
2020/02/18 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
2014财务年终工作总结
2014/12/08 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
人民调解协议书
2016/03/21 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
Go语言基础map用法及示例详解
2021/11/17 Golang