在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()   

相关内容

    暂无相关文章

评论关闭