jjzjj

PyGILState

全部标签

python - 如何中断嵌入在 C++ 应用程序中的 python 解释器

我们有一个C++QT应用程序,我们在其中嵌入了Python。我们为用户提供了两个接口(interface)1.执行文件2.停止执行。我们使用PyRun_FileExFlags在非GUI线程中执行python文件。我们想中断python文件的执行(假设python文件有一个无限循环,它永远不会完成执行)。如何中断?我们尝试了以下1.在主线程中使用PyEval_SetTrace设置跟踪2.(如果用户点击停止执行)在跟踪回调函数中我们设置错误“PyErr_SetString”1:设置跟踪功能PyGILState_STATEstate;state=PyGILState_Ensure();PyE

c++ - Python GIL 和线程

我在我的大型C++应用程序中嵌入了Python3。Python赋予了用户自定义数据处理脚本的能力。问题:我有许多与Python交互的线程,但我并不真正了解如何使用GIL保护我的代码。到目前为止,我使代码正常工作的唯一方法是使用boost::mutex。这是一个重现我的问题的非常简单的例子:线程A首先调用Init()来初始化Python(静态函数)。线程B调用Pythonize()在Python上做一些工作。线程B在第一次调用锁定GIL时被阻塞。代码:#include#include#include#include"Python.h"structRTMaps_GILLock{RTMaps

python - PyGILState_Ensure() 导致死锁

我正在用C++编写一个Python扩展,包装一个我不控制的第三方库。该库创建了一个Python一无所知的线程,并从该线程调用我提供给该库的C++回调。我希望该回调调用Python函数,但我使用从文档中读取的方法遇到了死锁。这是我对这些的解释。voidWrapper::myCallback(){PyGILState_STATEgstate=PyGILState_Ensure();PyObject*result=PyObject_CallMethod(_pyObj,"callback",nullptr);if(result)Py_DECREF(result);PyGILState_Rele

python - CPython - 在主线程中锁定 GIL

CPython线程支持的文档令人沮丧地矛盾和稀疏。一般来说,似乎每个人都同意嵌入Python的多线程C应用程序必须始终在调用Python解释器之前获取GIL。通常,这是通过以下方式完成的:PyGILState_STATEs=PyGILState_Ensure();/*dostuffwithPython*/PyGILState_Release(s);文档非常清楚地说明了这一点:https://docs.python.org/2/c-api/init.html#non-python-created-threads然而,在实践中,让嵌入Python的多线程C程序真正顺利地运行是另一回事。似乎

python - 在多线程 C 应用程序中嵌入 python

我将python解释器嵌入到一个多线程C应用程序中,我有点困惑应该使用哪些API来确保线程安全。根据我收集到的信息,在嵌入python时,在调用任何其他PythonCAPI调用之前,由嵌入器负责处理GIL锁。这是通过以下函数完成的:gstate=PyGILState_Ensure();//dosomepythonapicalls,runpythonscriptsPyGILState_Release(gstate);但仅此一项似乎还不够。我仍然遇到随机崩溃,因为它似乎没有为PythonAPI提供互斥。在阅读了更多文档后,我还添加了:PyEval_InitThreads();在调用Py_I

python - 在多线程 C 应用程序中嵌入 python

我将python解释器嵌入到一个多线程C应用程序中,我有点困惑应该使用哪些API来确保线程安全。根据我收集到的信息,在嵌入python时,在调用任何其他PythonCAPI调用之前,由嵌入器负责处理GIL锁。这是通过以下函数完成的:gstate=PyGILState_Ensure();//dosomepythonapicalls,runpythonscriptsPyGILState_Release(gstate);但仅此一项似乎还不够。我仍然遇到随机崩溃,因为它似乎没有为PythonAPI提供互斥。在阅读了更多文档后,我还添加了:PyEval_InitThreads();在调用Py_I

c++ - 为什么 PyGILState_Release 抛出致命的 Python 错误

已回答好的,我解决了这个问题。这完全取决于您如何初始化线程状态。您根本不需要使用ReleaseLock。只需将InitThreads调用添加到您的模块定义中:BOOST_PYTHON_MODULE(ModuleName){PyEval_InitThreads();...}好吧,我花了好几个小时试图诊断这个问题,并仔细研究了网络上的每个示例。现在累了,所以我可能会遗漏一些明显的东西,但这是正在发生的事情:我正在用boostpython包装一个库。我正在运行一个python脚本,它导入lib,构造一些对象,然后从c++接收回调,回调到python。在调用任何python函数之前,我尝试获取

c++ - Python PyGILState_{Ensure/Release} 在从 Python 代码返回到 C++ 时导致段错误

更新好吧,看起来在调用PyGILState_Ensure()之前添加PyEval_InitThreads()就可以了。在我急于弄清楚事情的过程中,我错误地将我的“挂起”归因于PyEval_InitThreads()。但是,在阅读了一些Python文档之后,我想知道这是否是正确的解决方案。Itisnotsafetocallthisfunctionwhenitisunknownwhichthread(ifany)currentlyhastheglobalinterpreterlock.首先,我正在研究一些修改过的GNURadio代码——尤其是修改过的gr_bin_statistics_fb