2014-10-18 2 views
2

저는 멀티 스레드 C++ 프로그램에 파이썬을 임베딩하고 numpy를 병렬로 사용하여 간단한 계산을하는 방법을 찾고 있습니다.GIL을 잡지 않고 병렬로 수행 할 수있는 작업은 무엇입니까?

즉, numpy 기능을 호출하기 위해 PyRun_SimpleString을 사용하고 있습니다. 기존 numpy 배열에만 쓰고 다른 스레드에서 동일한 배열을 수정하지 않도록주의 할 경우 GIL을 가져오고 싶습니까?

의견에 언급 한 바와 같이 편집,이 여기에 해결되었습니다 Global Interpreter Lock and access to data (eg. for NumPy arrays)

과 가능한 해결책은 직접 GIL 방출을 담당하는 ctypes 사용 NumPy와의 C 인터페이스를 사용하는 것입니다 : 후세를 들어 https://stackoverflow.com/a/5868051/419116

을 여기

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입니다 : 여기 당신은 "A는 * = 2"잡는없이 GIL이해야 할 때 실제로 발생하는 상황 널 포인터 인 _PyThreadState_Current의 매크로. 따라서 GIL을 잡는 것은 파이썬 연산에 필요한 Thread 변수를 설정하는 것입니다.

+1

확신 할만큼 확실하지 않지만 http://stackoverflow.com/q/8824739/400617의 복제본입니까? – davidism

+0

@YaroslavBulatov 파이썬 객체와 관련없는 모든 작업 ... –

답변

0

GIL은 파이썬 인터프리터를 호출하기 때문에 PyRun_SimpleString에 필요합니다. GIL을 소유하지 않고 PyRun_SimpleString을 사용하면 프로세스가 분리됩니다.

GIL이 필요없는 NumPy C API의 부분은 있지만 파이썬 객체 나 인터프리터에는 손대지 않는 부분 만 있습니다. 한 예가 PyArray_DATA 매크로입니다.

관련 문제