首页 > 编程语言 > 详细

python使用锁访问共享变量

时间:2014-03-02 17:56:59      阅读:524      评论:0      收藏:0      [点我收藏+]

    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使用锁访问共享变量,布布扣,bubuko.com

python使用锁访问共享变量

原文:http://blog.csdn.net/u011608357/article/details/20228583

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!