本文研究的主要是Python使用锁访问共享变量,具体介绍和实现如下。
python 做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,pyhon中的threading模块提供了lock对象,lock中的acquire方法用于获取一个锁,而release用于释放一个锁。当一个线程取得锁时,它变获得了共享变量的访问权,此时进入阻塞状态,若其它线程申请访问这个变量,则必须等到这个线程调用release方法释放这个锁。下面是python中使用锁的实例:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/usr/bin/env python Stream Vera Sans Mono', 'Courier New', Courier, monospace !important; float: none !important; border-top-width: 0px !important; border-bottom-width: 0px !important; height: auto !important; color: rgb(0, 102, 153) !important; vertical-align: baseline !important; overflow: visible !important; top: auto !important; right: auto !important; font-weight: bold !important; left: auto !important; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;" class="py keyword">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.这样,一个线程可以多次请求同一个资源,在所有请求都被释放后,其它线程才允许获取这个锁。上面的代码做简单修改,可得:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/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使用锁访问共享变量实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!