python使用锁访问共享变量
2014-03-01 19:18
435 查看
python
做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,pyhon中的threading模块提供了lock对象,lock中的acquire方法用于获取一个锁,而release用于释放一个锁。当一个线程取得锁时,它变获得了共享变量的访问权,此时进入阻塞状态,若其它线程申请访问这个变量,则必须等到这个线程调用release方法释放这个锁。下面是python中使用锁的实例:
如果一个线程想多次获取资源访问权,在上面的程序中连续两次使用acquire(),将会造成死锁现象,因为第一次申请到的资源还没有来得及释放,就进行了第二次申请。python中的threading模块提供了可重入锁RLock,RLock提供了计数器。一个线程申请到某个资源,计数器会加1,释放掉这个资源计数器会减1.这样,一个线程可以多次请求同一个资源,在所有请求都被释放后,其它线程才允许获取这个锁。上面的代码做简单修改,可得:
做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,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多进程共享变量Value使用tips
- python:线程的使用、线程共享全局变量、列表作为参数(全局变量)、避免全局变量被修改
- python unittest TestCase间共享数据(全局变量的使用)
- spark 2.2.0 共享变量使用方法 python版
- python多线程共享变量的使用和效率
- python多进程共享变量Value使用tips
- 如何使用指针来访问类的内部变量
- selenium之python自动化测试系列:使用chrome或firefox的已存在的cookie访问网站
- ThreadLocal的使用,保证每一个线程都有自己的共享变量。
- 使用Python2.4在Linux下访问SQL Server(安装篇)
- python中全局变量的使用
- 如何使用python访问ECMWF公共数据集
- Android深入探究笔记之十 -- 使用 ContentProvider 共享数据(二),访问与添加通讯录
- 使用Python访问软连接
- 关于Python中全局变量的使用的调试
- 【Jena使用手册】用Python访问Apache Jena数据库 利用Fuseki搭建HTTP访问服务器
- NB-IoT使用笔记(5)在linux下用python搭建UDP转发服务器扩展NB可访问IP个数
- 由一个简单示例 引出java继承中父子类成员变量共享问题 以及super的使用