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统计列表中的重复项出现的次数的方法
Aug 18 Python
Python中的高级数据结构详解
Mar 27 Python
在Python中使用next()方法操作文件的教程
May 24 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
图文详解python安装Scrapy框架步骤
May 20 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 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系统流量分析的程序
2006/10/09 PHP
深入了解php4(2)--重访过去
2006/10/09 PHP
php在字符串中查找另一个字符串
2008/11/19 PHP
PHP7常量数组用法分析
2016/09/26 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
python实现C4.5决策树算法
2018/08/29 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
幼儿园运动会加油词
2014/02/14 职场文书
迟到检讨书300字
2014/02/14 职场文书
向领导表决心的话
2014/03/11 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
班干部演讲稿
2014/04/24 职场文书
访谈节目策划方案
2014/05/15 职场文书
电力培训心得体会
2014/09/02 职场文书
第二次离婚起诉书
2015/05/18 职场文书
刑事法律意见书
2015/06/04 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫