Python:用于交叉锁定获取的成语

时间:2015-09-22 16:20:13

标签: python python-multithreading idioms with-statement

假设我需要执行以下操作:

global_lock.acquire()
local_lock = threading.Lock()
local_lock.acquire()
register_local_lock(local_lock, some_associated_data)
global_lock.release()
do_some_work()
local_lock.release()

问:如何使用with语句实现相同的目标?

P.S。在我的应用程序中,实际上存在一种解决方法,将两次锁定获取分开。但是,我认为可能会有两个锁定获取必须保持交错的情况,所以我还在发帖,还有一个问题:

问:可以通过重构消除所有交错锁定获取吗?

1 个答案:

答案 0 :(得分:0)

Q2:是的,可以消除所有交错。查看操作系统上的任何文本。这可以追溯到Per Brink Hansen的开创性工作和“银行家的问题”。如果您以任何方式错误处理交错锁定获取,您可能会使系统陷入僵局。

在这种情况下,它看起来好像唯一的保护global_lock给出了访问threading.lock句柄的位置。这实际上是必要的吗?请注意,local_lock保护关键区域的其余部分。

Q1:见Python Conditional "With" Lock Design