- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我从不同的 C 线程调用 C-API 的 Py_Finalize() 时,我收到错误输出,而不是我进行 python 调用。
我看到的错误是:
Exception ignored in: <module 'threading' from 'C:\\Python34-32\\Lib\\threading.py'>
Traceback (most recent call last):
File "C:\Python34-32\Lib\threading.py", line 1289, in _shutdown
assert tlock.locked()
AssertionError:
这只发生在 Python 3.X(使用 3.4.2 测试)中,在 Python 2.7 中完全相同的代码没有任何问题。
这是一个最小的例子,它显示了当使用 C 线程时它会发生,而不是当所有事情都发生在单个 C 线程上时:
#include <iostream>
#include <fstream>
#include <thread>
#include <cassert>
#include <Python.h>
void make_file()
{
std::fstream file("my_test.py", std::ios::out);
file <<
"import threading\n" <<
"def my_function():\n" <<
" pass\n" ;
file.close();
}
void exec()
{
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject* pdict = PyDict_New();
PyDict_SetItemString(pdict, "__builtins__", PyEval_GetBuiltins());
PyRun_String("import my_test", Py_file_input, pdict, pdict);
PyRun_String("my_test.my_function()", Py_file_input, pdict, pdict);
assert(!PyErr_Occurred());
PyGILState_Release(gstate);
}
void basic()
{
std::cout << "--Starting Basic--" << std::endl;
Py_Initialize();
PyEval_InitThreads();
PyThreadState* threadState = PyEval_SaveThread();
exec();
PyEval_RestoreThread(threadState);
Py_Finalize();
std::cout << "--Basic Complete--" << std::endl;
}
void with_thread()
{
std::cout << "--Starting With Thread--" << std::endl;
Py_Initialize();
PyEval_InitThreads();
PyThreadState* threadState = PyEval_SaveThread();
std::thread t(exec);
t.join();
PyEval_RestoreThread(threadState);
Py_Finalize();
std::cout << "--With Thread Complete--" << std::endl;
}
int main(int argc, char* argv[])
{
make_file();
basic();
with_thread();
return 0;
}
--Starting Basic--
--Basic Complete--
--Starting With Thread--
Exception ignored in: <module 'threading' from 'C:\\Python34-32\\Lib\\threading.py'>
Traceback (most recent call last):
File "C:\Python34-32\Lib\threading.py", line 1289, in _shutdown
assert tlock.locked()
AssertionError:
--With Thread Complete--
main 中 basic()/with_thread() 调用的顺序无关紧要,我什至可以多次包含这些行而不会产生任何影响,每次 with_thread() 调用都会导致错误输出。
使 threadState 成为全局的,然后将 exec 更改为:
void exec()
{
//PyGILState_STATE gstate = PyGILState_Ensure();
PyEval_RestoreThread(threadState);
PyObject* pdict = PyDict_New();
PyDict_SetItemString(pdict, "__builtins__", PyEval_GetBuiltins());
PyRun_String("import my_test", Py_file_input, pdict, pdict);
PyRun_String("my_test.my_function()", Py_file_input, pdict, pdict);
assert(!PyErr_Occurred());
//PyGILState_Release(gstate);
threadState = PyEval_SaveThread();
}
导致错误消失,但是我有一个全局值,我需要在我的库的用户之间进行协调(在我的实际代码中,exec() 函数可以由任何人编写,我有更多的初始化我运行的东西)。关于如何使 GIL 抓取像原始示例一样更加隔离,同时保持线程兼容性,有什么见解吗?
最佳答案
尝试添加
Py_DECREF(PyImport_ImportModule("threading"));
之后
PyEval_InitThreads();
关于python - 使用线程调用 Py_Finalize 时出现 AssertionError(仅限 3.X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27844676/
我在运行大型嵌入式 Python 程序时遇到间歇性崩溃。我的问题是 Py_Finalize() 调用是否会阻塞,直到所有 python 解释器都处于安全状态才能继续?如果没有,我怎么知道解释器何时销毁
我正在尝试使用 Py_CompileString() 和 PyEval_EvalCode() 调用一些 python 代码。它工作正常,但是当 Python 代码包含错误时 Py_Finalize()
我有如下一段代码 int nArgs; if (LPWSTR * const szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs)) {
这是对 Call Python from C++ 的跟进 在程序启动时,我调用以下函数来初始化解释器: void initPython(){ PyEval_InitThreads();
在以下代码的第二次调用中,我的应用程序段错误,所以我想我错过了一些东西: Py_Initialize(); pName = PyString_FromString("comp_macbeth"); p
这是一个已知问题,但我想请教专家为我解决这个问题的最佳方法。 我有一个项目 (Euler Math Toolbox),它将 Python 作为脚本语言运行。为此,在运行时加载一个库模块“python.
在第二次调用以下代码时,我的应用出现段错误,所以我想我遗漏了一些东西: Py_Initialize(); pName = PyString_FromString("comp_macbeth"); pM
当我从不同的 C 线程调用 C-API 的 Py_Finalize() 时,我收到错误输出,而不是我进行 python 调用。 我看到的错误是: Exception ignored in: Trac
感谢您对此提供的帮助——这个问题的变体已被问过很多次,但我还没有找到完整的答案。我正在将嵌入式 Python 3.4.2 添加到使用 MS MFC 类以 C++ 编写的现有模拟器工具中。该应用程序是多
在下面这个 hello world C 程序中,我同时扩展和嵌入了 Python。 spam.c: #include static PyObject * spam_echo(PyObject *se
我正在开发一个使用此 C++ matplotlib 包装器的项目 matplotlibcpp.h . 使用这个原始头文件的一个最小例子是 #include "matplotlibcpp.h"
这发生在 Python 3.4.3 中,来自非 python 创建的线程: https://docs.python.org/3.4/c-api/init.html#non-python-created
我是一名优秀的程序员,十分优秀!