我在python中遇到一个死锁。我有一个threading.Lock()全局变量:lock
这段代码在一个文件中的类的构造函数中运行,其中包含一个条件变量:self.worker_condition = threading.Condition(lock=lock) (全局锁)
lock.acquire()
alive_tcp_connections[worker_port] = False
self.tcp_thread.start()
print("waiting on cv")
with self.worker_condition:
while alive_tcp_connections[worker_port]:
self.worker_condition.wait()
print("worker woke up")
lock.release()这是tcp_thread运行的函数:
while True:
# this will listen on this socket and return a json of what it captures
if node_type == "worker":
lock.acquire()
print(node_type, " TCP Listener started")
alive_tcp_connections[port] = True
cv.notify()
lock.release()问题是最后一个打印语句是"waiting on CV",tcp_thread代码不运行并且挂起在锁上,构造函数代码(第一个)挂起在wait()上
导致死锁的原因可能是什么?
发布于 2020-11-01 02:21:59
您的代码按预期运行。您有一个全局锁。您在父线程中获取锁,然后调用子线程。子进程尝试获取锁,但失败了,因为父进程已经拥有该锁。
父级不应获取锁。或者,您可以为孩子使用单独的锁。
发布于 2020-11-01 02:56:22
复核条件对象文档:
https://docs.python.org/3/library/threading.html#condition-objects
您有对象:lock、cv和self.worker_condition引用,它们需要引用相同的条件对象才能使wait和notify工作。
(至少我是这么看的)
https://stackoverflow.com/questions/64624855
复制相似问题