Python 3:我可以同时锁定多个锁吗



我有多个锁,它们锁定API的不同部分。

为了锁定任何方法,我做了这样的事情:

import threading
class DoSomething:
def __init__():
self.lock = threading.Lock()
def run(self):
with self.lock:
# do stuff requiring lock here

对于大多数用例来说,这很好用。

但是,我不确定当需要多个锁时我所做的是否有效:

import threading
class DoSomething:
def __init__():
self.lock_database = threading.Lock()
self.lock_logger = threading.Lock()
def run(self):
with self.lock_database and self.lock_logger:
# do stuff requiring lock here

事实上,代码运行得很好,但我不确定它是否能像我希望的那样运行

我的问题是:锁是同时获得的,还是第一个锁获得了,然后第二个锁也获得了。

我以前的代码如下吗?

with self.lock1:
with self.lock2:
# do stuff here

事实上,代码目前可以工作,但由于我的线程同时需要相同锁的几率从一开始就非常低,我可能会在以后调试时遇到巨大的头痛

我提出这个问题是因为我非常不确定如何测试我的代码以确保它按预期工作,我同样有兴趣得到答案,并知道如何测试它以确保它工作(而不是最终由最终用户为我测试它(

是的,您可以这样做,但要注意死锁。当一个线程由于需要获取其他线程正在持有的锁而无法取得进展,而第二个线程由于想要第一个线程已经持有的锁,而无法取得进度时,就会发生死锁。

您的代码示例首先锁定lock_database,然后锁定lock_logger。如果你能保证任何锁定它们的线程总是以相同的顺序锁定它们,那么你就安全了。僵局永远不会以这种方式发生。但是,如果一个线程在试图锁定lock_logger之前锁定了lock_database,而另一个线程试图以相反的顺序获取它们,那么就会出现死锁。

看起来很简单。是的,除了

在一个更复杂的程序中,锁被附加到传递给不同函数的对象上,那么这可能就不那么容易了,因为一个线程可能会调用某个foobar(a, b)函数,而另一个线程对相同的两个对象调用相同的foobar(),除非对象被切换。

最新更新