저는 멀티 스레드 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 변수를 설정하는 것입니다.
확신 할만큼 확실하지 않지만 http://stackoverflow.com/q/8824739/400617의 복제본입니까? – davidism
@YaroslavBulatov 파이썬 객체와 관련없는 모든 작업 ... –