为什么我的线程在通知/释放 Condition 对象时没有启动备份?



这个问题与Python 3.6有关。

我有一段代码,它运行着线程库中的一个线程,以及程序的主线程。两个线程都访问一个不安全的对象,所以在使用对象之前,我让它们锁定一个Condition对象。我派生的线程只需要每5分钟访问/更新一次该对象,所以循环中有一个5分钟的睡眠计时器。

目前,主线程从未获得锁。当第二个线程释放Condition并开始等待sleep()调用时,主线程永远不会唤醒/获取锁。就好像主线死了一样。

class Loader:
def __init__(self, q):
...
self.queryLock = threading.Condition()
...
thread = Thread(target=self.threadfunc, daemon=True)
thread.start()
...
self.run()
def threadfunc(self):
...
while True:
self.queryLock.acquire()
[critical section #1]
self.queryLock.notify()
self.queryLock.release()
sleep(300)
def run(self):
...
while True:
...
self.queryLock.acquire()
[critical section #2]
self.queryLock.notify()
self.queryLock.release()
...

我相信您实际上并不需要使用Condition。在您的案例中,一个简单的Lock似乎可以完成任务。您实际上并没有验证某个条件是否满足,也没有使用condition的特殊方法wait()


也就是说,关于您提供的代码,您的主线程似乎太";快速";,并且在另一个线程获得机会之前重新获取锁。这是一个稍微修改过的代码版本,其中主线程等待了一段时间,给了另一个线程一个机会,它成功地获得了锁并继续。

class Loader:
def __init__(self):
self.queryLock = threading.Condition()
thread = Thread(target=self.threadfunc, daemon=True)
thread.start()
self.run()

def threadfunc(self):
while True:
self.queryLock.acquire()
print("critical section 1")
time.sleep(1)
self.queryLock.notify()
self.queryLock.release()
time.sleep(5)

def run(self):
while True:
self.queryLock.acquire()
print("critical section 2")
time.sleep(2)
self.queryLock.notify()
self.queryLock.release()
print("main is waiting a bit")
time.sleep(1)

Loader()

比赛条件很有趣:(

最新更新