boost.python 真正的多线程

Posted

技术标签:

【中文标题】boost.python 真正的多线程【英文标题】:True multithreading with boost.python 【发布时间】:2011-12-12 20:23:15 【问题描述】:

我正在尝试测试多线程 C++ DLL。这个 DLL 应该是线程安全的。我用 boost.python 包装了它,我想创建多个 python 线程来通过 boost.python 包装器来运行 DLL。我实际上是在尝试导致线程问题。

我似乎找不到好的文档是 python 解释器是否支持它的两个线程(比如在不同的内核上)同时调用一个导入的模块,以及 GIL 是否需要照管,因为我不希望在 DLL 应提供的安全性之上增加任何安全性。

任何人都可以描述或参考我从多个线程调用 DLL 模块的描述以及在这种情况下应该如何使用 GIL 吗?

【问题讨论】:

显然你必须自己释放 GIL,否则你一次只能运行一个线程。见***.com/questions/1576737/… 这是***.com/questions/8009613的副本吗? 一个附带问题:如果我不释放 GIL,并且从 Python 调用的 C++ 代码创建了一个线程,那么这个线程是否可以安全地调用 Python 代码。我想这不会解释我遇到的崩溃...... 【参考方案1】:

通过Boost.Pyhton从Python调用C++函数时如何释放GIL:

http://wiki.python.org/moin/boost.python/HowTo#Multithreading_Support_for_my_function

【讨论】:

【参考方案2】:

答案是否定的,除非 DLL 手动释放锁,否则 GIL 永远不会真正实现多线程。 Python 一次只允许一个线程运行,除非扩展手动说“我被阻止了,没有我继续。”这通常使用 python 的 include/ceval.h 中定义的 Py_BEGIN_ALLOW_THREADS 宏(并使用 Py_END_ALLOW_THREADS 撤消)来完成。一旦扩展执行此操作,python 将允许另一个线程运行,并且执行任何 python 内容的第一个线程可能会导致问题(正如评论问题所指出的那样。)它实际上是为了阻塞 I/O 或进入繁重的计算时间。

【讨论】:

以上是关于boost.python 真正的多线程的主要内容,如果未能解决你的问题,请参考以下文章

Python 线程内存布局(结合 boost::python)

boost::python - 如何从 C++ 在自己的线程中调用 python 函数?

Boost python /从线程导入模块需要ReleaseLock()。为啥?

boost.build 与 boost.python

将 boost::python::numpy::ndarray 作为 boost::python 函数的(默认与否)参数传递?

Python、线程、GIL 和 C++