在Python定时器中Lock的实际应用操作方案详解

Python定时器是计算机常用的计算机语言,在其广泛的实际应用操作中会涉及到Lock的实际应用,如果你对Python定时器中Lock的实际应用感兴趣的话,你可以通过我们的文章对其有更深的了解。

在Python定时器中Lock的实际应用

Lock/RLock 和 C# lock 关键字差不多意思。不同的是,Lock/RLock 只需 "锁定" 自己,而 C# lock 还得另外找个引用类型对象。Lock 有个问题就是同一个线程内部也不能多次 "锁定",否则会死锁。RLock 没有这个问题,它会处理 "owning thread" 和 "recursion level" 状态,对于同一线程的多次请求锁行为,只累加计数器。

每次调用 release() 将递减该计数器,直到 0 时释放锁,因此记住 acquire() 和 release() 要成对出现。直接用 RLock,忘了 Lock 吧。

非锁定版本:

 
 
 
  1. def test():  
  2. for i in range(3):  
  3. print currentThread().name, i  
  4. sleep(1)  
  5. for i in range(2):  
  6.  
  7. Thread(target = test).start()   

 

输出:

 
 
 
  1. $ ./main.py  
  2. Thread-1 0  
  3. Thread-2 0  
  4. Thread-1 1  
  5. Thread-2 1  
  6. Thread-1 2  
  7. Thread-2 2   

 

锁定版本:

 
 
 
  1. lock = RLock()  
  2. def test():  
  3. lock.acquire()  
  4. try:  
  5. for i in range(3):  
  6. print currentThread().name, i  
  7. sleep(1)  
  8. finally:  
  9. lock.release()  
  10. for i in range(2):  
  11. Thread(target = test).start()   

 

输出:

 
 
 
  1. $ ./main.py  
  2. Thread-1 0  
  3. Thread-1 1  
  4. Thread-1 2  
  5. Thread-2 0  
  6. Thread-2 1  
  7. Thread-2 2   

 

RLock 实现了 Context Management Protocol,会自动调用 acquire() 和 release() 函数,因此直接用 with/as 来实现 C# "lock(o) { ... }"。

 
 
 
  1. lock = RLock()  
  2. def test():  
  3. with lock:  
  4. for i in range(3):  
  5. print currentThread().name, i  
  6. sleep(1)  
  7. for i in range(2):  
  8. Thread(target = test).start()   

网站标题:在Python定时器中Lock的实际应用操作方案详解
转载来源:http://www.csdahua.cn/qtweb/news0/475500.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网