我正在研究将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操作所需的一些线程变量
我不知道足够确定,但是这是http://stackoverflow.com/q/8824739/400617的副本吗? – davidism 2014-10-18 19:03:44
@YaroslavBulatov任何不涉及Python对象的操作... – 2014-10-18 20:17:39