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 吧。
非锁定版本:
- def test():
- for i in range(3):
- print currentThread().name, i
- sleep(1)
- for i in range(2):
- Thread(target = test).start()
输出:
- $ ./main.py
- Thread-1 0
- Thread-2 0
- Thread-1 1
- Thread-2 1
- Thread-1 2
- Thread-2 2
锁定版本:
- lock = RLock()
- def test():
- lock.acquire()
- try:
- for i in range(3):
- print currentThread().name, i
- sleep(1)
- finally:
- lock.release()
- for i in range(2):
- Thread(target = test).start()
输出:
- $ ./main.py
- Thread-1 0
- Thread-1 1
- Thread-1 2
- Thread-2 0
- Thread-2 1
- Thread-2 2
RLock 实现了 Context Management Protocol,会自动调用 acquire() 和 release() 函数,因此直接用 with/as 来实现 C# "lock(o) { ... }"。
- lock = RLock()
- def test():
- with lock:
- for i in range(3):
- print currentThread().name, i
- sleep(1)
- for i in range(2):
- Thread(target = test).start()
【编辑推荐】