【发布时间】:2014-12-14 01:42:57
【问题描述】:
我正在研究将 Python 嵌入到多线程 C++ 程序中,并使用 numpy 并行进行简单计算。
换句话说,我使用PyRun_SimpleString 来调用numpy 函数。如果我只写入现有的 numpy 数组,并且注意不要从不同的线程修改同一个数组,是否需要获取 GIL?
编辑,如 cmets 中所述,此处已解决:Global Interpreter Lock and access to data (eg. for NumPy arrays)
一个可能的解决方案是使用负责释放 GIL 的 ctypes 直接使用 numpy c 接口:https://stackoverflow.com/a/5868051/419116
对于后代,当您尝试在不获取 GIL 的情况下执行“a*=2”时实际发生的情况如下:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000acc242 in PyImport_GetModuleDict ()
at python_runtime/v2_7/Python/import.c:433
433 PyInterpreterState *interp = PyThreadState_GET()->interp;
#0 0x0000000000acc242 in PyImport_GetModuleDict ()
at python_runtime/v2_7/Python/import.c:433
#1 0x0000000000accca1 in PyImport_AddModule (
name=0x13e9255 <.L.str53> "__main__")
at python_runtime/v2_7/Python/import.c:672
#2 0x0000000000aab29f in PyRun_SimpleStringFlags (
command=0x13e8831 <.L.str10> "a*=2", flags=0x0)
at python_runtime/v2_7/Python/pythonrun.c:976
#3 0x00000000008e3300 in main (argc=1, argv=0x7fffd2226ec0)
at python_embed/interactive_nogil.cc:56
这里PyThreadState_GET 是_PyThreadState_Current 的宏,它是一个空指针。所以显然抓住 GIL 还涉及设置任何 Python 操作所需的一些 Thread 变量
【问题讨论】:
-
@YaroslavBulatov 任何不涉及 Python 对象的操作...
标签: python numpy python-internals