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 相关文章推荐
django模板语法学习之include示例详解
Dec 17 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
人工神经网络算法知识点总结
Jun 11 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
彻底解决Python包下载慢问题
Nov 15 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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP中使用curl入门教程
2015/07/02 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python用for循环实现九九乘法表
2018/05/31 Python
python使用Matplotlib画饼图
2018/09/25 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
2020/08/05 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
思想专业自荐信范文
2013/12/25 职场文书
安全教育月活动总结
2014/05/05 职场文书
父亲节活动策划方案
2014/08/24 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
采购部年度工作总结
2015/08/13 职场文书
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android