2013-02-17 5 views
5

나는 PyEval_InitThreads에 전화해야 할 때 약간 혼란 스럽다. 일반적으로 PyEval_InitThreads은 비 파이썬 스레드 (즉, 확장 모듈에서 생성 된 스레드)가 사용될 때마다 호출되어야한다는 것을 알고 있습니다.PyEval_InitThreads는 언제 호출되어야합니까?

그러나 PyEval_InitThreads이 파이썬 인터프리터를 포함하는 C 프로그램 또는 C- 확장 모듈을 가져 오는 파이썬 프로그램 또는 둘 모두에 해당하는 경우 혼란 스럽습니다.

내부적으로 스레드를 시작하는 C 확장 모듈을 작성하면 모듈을 초기화 할 때 PyEval_InitThreads을 호출해야합니까?

또한 PyEval_InitThreadsimplicitly 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과 함께 하시겠습니까?

+0

'PyEval_ReleaseLock()'없이 시도하십시오. 좋은 이유 때문에 GIL이 획득되었습니다. 파이썬에서 다른 C API 함수를 호출하기 전에이를 해제하면 크래시가 발생합니다. –

답변

3

대부분의 응용 프로그램은 PyEval_InitThreads()에 대해 전혀 알 필요가 없습니다.

embedding 응용 프로그램 또는 확장 모듈이 하나 이상의 스레드 에서 Python C API 호출을 작성하여 파이썬 외부에을 생성하는 경우에만 사용해야합니다.

파이썬 C API 호출을 나중에 수행 할 스레드에서 PyEval_ReleaseLock()을 호출하지 마십시오 (이전에 다시 획득하지 않는 한). 이 경우 실제로는 Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS 매크로를 사용해야합니다.

+1

이 대답을 이해할 수 없습니다. 파이썬을 C 프로그램에 임베드하고 20 개의 워커 스레드가 있고 PyEval_InitThreads를 호출해야한다고 가정하면, 파이썬 작업을 수행해야하는 다른 스레드가 GIL을 얻을 수 있도록 다른 작업을 수행하는 동안 각 작업자가 잠금을 해제하는 방법 ? – DougN

+0

@DougN, 예, 동의합니다. 대답은 모호합니다 (불행히도 파이썬 문서 자체가 그렇듯이) –

+2

파이썬을 C 프로그램에 임베드하는 경우 임베디드 파이썬 인터프리터를 초기화 할 때 전체 프로그램에 대해 한 번 호출하여 첫 ​​번째 파이썬 코드를 실행하게합니다. – gps