我正在研究將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