나는 PyEval_InitThreads
에 전화해야 할 때 약간 혼란 스럽다. 일반적으로 PyEval_InitThreads
은 비 파이썬 스레드 (즉, 확장 모듈에서 생성 된 스레드)가 사용될 때마다 호출되어야한다는 것을 알고 있습니다.PyEval_InitThreads는 언제 호출되어야합니까?
그러나 PyEval_InitThreads
이 파이썬 인터프리터를 포함하는 C 프로그램 또는 C- 확장 모듈을 가져 오는 파이썬 프로그램 또는 둘 모두에 해당하는 경우 혼란 스럽습니다.
내부적으로 스레드를 시작하는 C 확장 모듈을 작성하면 모듈을 초기화 할 때 PyEval_InitThreads
을 호출해야합니까?
또한 PyEval_InitThreads
implicitly acquires the Global Interpreter Lock입니다. 따라서 PyEval_InitThreads
을 호출 한 후에는 이으로 릴리스되거나 교착 상태가 발생해야합니다. 그러면 자물쇠는 어떻게 풀습니까? 문서를 읽은 후에는 PyEval_ReleaseLock()
이 GIL을 해제하는 방법 인 것처럼 보입니다.
PyEval_InitThreads();
PyEval_ReleaseLock();
이
... 다음 런타임에 파이썬으로 중단 : 나는 C 확장 모듈에 다음 코드를 사용하는 경우, 실제로는, 그래서
Fatal Python error: drop_gil: GIL is not locked
은 어떻게 취득 후 GIL을 해제 할 PyEval_InitThreads
과 함께 하시겠습니까?
'PyEval_ReleaseLock()'없이 시도하십시오. 좋은 이유 때문에 GIL이 획득되었습니다. 파이썬에서 다른 C API 함수를 호출하기 전에이를 해제하면 크래시가 발생합니다. –