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中的二进制位运算符
May 13 Python
python数据结构之链表详解
Sep 12 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
python中的常量和变量代码详解
Jul 25 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
Python队列、进程间通信、线程案例
Oct 25 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
python实现简单的tcp 文件下载
Sep 16 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
python 实现波浪滤镜特效
Dec 02 Python
python模板入门教程之flask Jinja
Apr 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php GeoIP的使用教程
2011/03/09 PHP
php实现加减法验证码代码
2014/02/14 PHP
php中smarty区域循环的方法
2015/06/11 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
浅谈php处理后端&接口访问超时的解决方法
2016/10/29 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
php多进程应用场景实例详解
2019/07/22 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
vscode自定义vue模板的实现
2021/01/27 Vue.js
深入理解Python对Json的解析
2017/02/14 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
导购员的岗位职责
2014/02/08 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
捐书倡议书
2014/08/29 职场文书
会计专业求职信范文
2015/03/19 职场文书
书法社团活动总结
2015/05/07 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL