2014-10-18 48 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宏。

相關問題