gpt4 book ai didi

Python 嵌入线程——避免死锁?

转载 作者:太空狗 更新时间:2023-10-29 21:55:53 24 4
gpt4 key购买 nike

有没有办法嵌入 python,允许从 python 到 C++ 的回调,允许 Python 代码产生线程,并避免死锁?

问题是这样的:

  • 要调用 Python,我需要持有 GIL。通常,我会在第一次创建解释器时获取主线程状态,然后在调用 Python 之前使用 PyEval_RestoreThread() 获取 GIL 并交换线程状态。

  • 从 Python 调用时,我可能需要访问一些 protected 资源,这些资源受主机中单独的关键部分的保护。这意味着 Python 将持有 GIL(可能来 self 最初调用的其他线程),然后尝试获取我的保护锁。

  • 调用 Python 时,我可能需要持有相同的锁,因为我可能会迭代某些对象集合,例如。

问题是,即使我在调用 Python 时持有 GIL,Python 也可能放弃它,将其交给另一个线程,然后让该线程调用我的主机,期望获取主机锁。同时,主机可能会获取主机锁和 GIL 锁,并调用 Python。死锁随之而来。

这里的问题是,当我调用它时,Python 将 GIL 放弃给另一个线程。这就是它预期要做的,但它使得顺序锁定变得不可能——即使我先使用 GIL,然后使用我自己的锁,然后调用 Python,Python 将从另一个线程调用到我的系统中,期望使用我自己的锁(因为它通过释放它取消了 GIL 的排序)。

我真的无法让系统的其余部分对系统中所有可能的锁都使用 GIL——这甚至无法正常工作,因为 Python 仍可能将其释放到另一个线程。

我也不能真正保证我的主机在进入 Python 时不持有任何锁,因为我无法控制主机中的所有代码。

那么,难道就不能这样吗?

最佳答案

“调用 Python 时,我可能需要持有相同的锁,因为我可能会迭代某些对象集合,例如。”

这通常表明具有多个线程的单个进程是不合适的。也许在这种情况下,多个进程(每个进程都具有集合中的特定对象)更有意义。

独立进程——每个进程都有自己的线程池——可能更容易管理。

关于Python 嵌入线程——避免死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com