Python GIL 和死锁检测?

Python GIL and deadlock detection?

提问人:Jan Wielemaker 提问时间:10/6/2023 最后编辑:pippo1980Jan Wielemaker 更新时间:10/6/2023 访问量:38

问:

在多线程环境中使用 Python 时,很容易死锁,因为我们需要锁定 Python GIL。在尝试锁定 GIL 时,我们可能会持有其他锁,而持有 GIL 的 Python 线程可能会调用我们试图获取相同的锁。理想情况下,我们会有一个这样的情况,即在失败时,我们可以检查我们持有的锁并引发“会死锁”异常。我在 Python 文档中找不到任何允许我这样做的内容。PyGILSTATE_TryEnsure()

有没有办法实现这一目标?

python 多线程 死锁 gil

评论

0赞 Booboo 10/15/2023
您需要提供一个具体的例子来演示这个问题。我想了解一下你有一个潜在的僵局情况,如果没有GIL,这种情况就不会仍然存在。
0赞 Jan Wielemaker 10/17/2023
这是一个典型的僵局情况。线程 1 持有锁 A 并尝试获取 GIL,线程 2 持有 GIL 并尝试获取锁 A。我观察到的具体情况与Janus有关,这是一个在几个Prolog系统中建立事实上的标准Prolog <-> Python接口的项目。锁 A 是 Prolog 输出流上的锁。一个 Prolog 线程尝试在锁定输出流的情况下调用 Python,而一个名为 Prolog 的 Python 线程尝试写入同一输出流。
0赞 Booboo 10/17/2023
你说线程 2 持有 GIL 并试图获得锁 A,但如果锁不能立即获取,肯定会进入等待状态,直到锁被释放并可以获取。但在它进入等待状态之前,它肯定会首先发布 GIL,不是吗?然后,这给了线程 1 获取 GIL 并最终释放它所持有的锁的机会。我用锁编写过线程代码,但从未经历过您描述的死锁。那只是我吗?因此,请发布一个最小的、可重复的示例
0赞 Booboo 10/18/2023
你的问题的含义是,Python 的设计存在致命缺陷,因为 GIL 的存在无法可靠地使用实例。你会认为,如果这个问题真的是一个问题,那么很久以前就有人会提出这个问题。正如我之前所说,如果你遇到僵局,我不明白你怎么能责怪 GIL;我相信在没有 GIL 的情况下,您还有其他一些问题。threading.Lock
0赞 Jan Wielemaker 10/18/2023
我认为你是对的。线程 2,运行 Python 代码并调用 Prolog(将尝试获取锁 A)可以使用 .这应该允许线程 1 继续并释放锁 A。事实上,与此同时,从 Python 到 Prolog 的所有调用现在都使用 /,这样 Prolog 线程就可以并发运行。谢谢。Py_BEGIN_ALLOW_THREADSPy_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS

答: 暂无答案