python使用锁访问共享变量实例解析


Posted in Python onFebruary 08, 2018

本文研究的主要是python使用锁访问共享变量,具体介绍和实现如下。

python 做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,pyhon中的threading模块提供了lock对象,lock中的acquire方法用于获取一个锁,而release用于释放一个锁。当一个线程取得锁时,它变获得了共享变量的访问权,此时进入阻塞状态,若其它线程申请访问这个变量,则必须等到这个线程调用release方法释放这个锁。下面是python中使用锁的实例:

#!/usr/bin/env python 
import threading,time 
q=threading.Lock()  #create a lock object 
def mythread(): 
  global a 
  q.acquire()   #acquire the lock 
  a=threading.currentThread().getName() 
  print "a is modified by",a 
  q.release()   #release the lock 
   
for i in range(1,4): 
  t=threading.Thread(target=mythread,name="Thread %d"%i) 
  t.start()

如果一个线程想多次获取资源访问权,在上面的程序中连续两次使用acquire() ,将会造成死锁现象,因为第一次申请到的资源还没有来得及释放,就进行了第二次申请。python中的threading模块提供了可重入锁RLock,RLock提供了计数器。一个线程申请到某个资源,计数器会加1,释放掉这个资源计数器会减1.这样,一个线程可以多次请求同一个资源,在所有请求都被释放后,其它线程才允许获取这个锁。上面的代码做简单修改,可得:

#!/usr/bin/env python 
import threading,time 
q=threading.RLock()    #create a lock object 
def mythread(): 
  global a 
  q.acquire()    #acquire the lock 
  a=threading.currentThread().getName() 
  print "a is modified by",a 
  q.acquire() 
  a=threading.currentThread().getName() 
  print "a is modified by %s the second time"% a 
  q.release()    
  q.release()    #release the lock 
for i in range(1,4): 
  t=threading.Thread(target=mythread,name="Thread %d"%i) 
  t.start()

总结

以上就是本文关于python使用锁访问共享变量实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
python 全文检索引擎详解
Apr 25 Python
Python实现购物车功能的方法分析
Nov 10 Python
Python自定义线程池实现方法分析
Feb 07 Python
python使用锁访问共享变量实例解析
Feb 08 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
python实现机器学习之元线性回归
Sep 06 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
pytorch 修改预训练model实例
Jan 18 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
Python3合并两个有序数组代码实例
Aug 11 Python
Python异常对代码运行性能的影响实例解析
Feb 08 #Python
Python科学计算包numpy用法实例详解
Feb 08 #Python
Python多进程并发与多线程并发编程实例总结
Feb 08 #Python
Python的CGIHTTPServer交互实现详解
Feb 08 #Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 #Python
python实现二叉查找树实例代码
Feb 08 #Python
单链表反转python实现代码示例
Feb 08 #Python
You might like
php对象和数组相互转换的方法
2015/05/12 PHP
php中switch语句用法详解
2015/08/17 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
python修改注册表终止360进程实例
2014/10/13 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
详解K-means算法在Python中的实现
2017/12/05 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
python 模块导入问题汇总
2021/02/01 Python
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
计算机专业个人简短的自我评价
2013/10/23 职场文书
项目施工员岗位职责
2014/03/09 职场文书
社区助残日活动总结
2014/08/29 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
租车协议书范本2014
2014/11/17 职场文书
Redis唯一ID生成器的实现
2022/07/07 Redis