首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的线程死锁

Python中的线程死锁
EN

Stack Overflow用户
提问于 2020-11-01 01:58:23
回答 2查看 97关注 0票数 0

我在python中遇到一个死锁。我有一个threading.Lock()全局变量:lock

这段代码在一个文件中的类的构造函数中运行,其中包含一个条件变量:self.worker_condition = threading.Condition(lock=lock) (全局锁)

代码语言:javascript
运行
复制
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运行的函数:

代码语言:javascript
运行
复制
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()

导致死锁的原因可能是什么?

EN

回答 2

Stack Overflow用户

发布于 2020-11-01 02:21:59

您的代码按预期运行。您有一个全局锁。您在父线程中获取锁,然后调用子线程。子进程尝试获取锁,但失败了,因为父进程已经拥有该锁。

父级不应获取锁。或者,您可以为孩子使用单独的锁。

票数 0
EN

Stack Overflow用户

发布于 2020-11-01 02:56:22

复核条件对象文档:

https://docs.python.org/3/library/threading.html#condition-objects

您有对象:lockcvself.worker_condition引用,它们需要引用相同的条件对象才能使waitnotify工作。

(至少我是这么看的)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64624855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档