2014-10-18 52 views
2

我正在研究将Python嵌入到多线程C++程序中,并且使用numpy并行执行简单的计算。哪些操作可以并行完成而不需要抓取GIL?

换句话说,我使用PyRun_SimpleString来调用numpy函数。如果我只写入现有的numpy数组,并且注意不要从不同的线程修改同一个数组,那么是否需要获取GIL?

编辑,如评论所说,这是在这里解决:Global Interpreter Lock and access to data (eg. for NumPy arrays)

和可能的解决方案是使用numpy的C接口直接使用ctypes的这需要释放GIL的护理:https://stackoverflow.com/a/5868051/419116

为后人,这里是当你尝试做“一* = 2”不抓GIL到底发生了什么:

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操作所需的一些线程变量

+1

我不知道足够确定,但是这是http://stackoverflow.com/q/8824739/400617的副本吗? – davidism 2014-10-18 19:03:44

+0

@YaroslavBulatov任何不涉及Python对象的操作... – 2014-10-18 20:17:39

回答

0

GIEL对于PyRun_SimpleString是必需的,因为它调用Python解释器。如果您在没有拥有GIL的情况下使用PyRun_SimpleString,则该过程将会出现段错误。

NumPy C API的一些部分不需要GIL,但只有那些不接触Python对象或解释器的部分。一个例子是PyArray_DATA宏。

相关问题