服务器之家

服务器之家 > 正文

python使用锁访问共享变量实例解析

时间:2021-01-13 00:47     来源/作者:零丁若叹

本文研究的主要是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
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使用锁访问共享变量实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

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

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部