그래서 일반적으로 파이썬에서 Global Interpreter Lock (GIL)이 어떻게 작동하는지 꽤 잘 알고 있습니다. 본질적으로 인터프리터가 실행 중일 때 한 스레드는 N tick 당 GIL을 보유하고 (N
은 sys.setcheckinterval
을 사용하여 설정할 수 있음), GIL이 해제되고 다른 스레드가 GIL을 획득 할 수 있습니다. 하나의 스레드가 I/O 작업을 시작하는 경우에도 발생합니다.파이썬 : GIL 컨텍스트 스위칭
제가 약간 혼란스러워하는 점은이 모든 것이 C 확장 모듈과 어떻게 작동하는지입니다.
GIL을 얻는 C 확장 모듈이 있고 PyEval_EvalCode
을 사용하여 일부 파이썬 코드를 실행하는 경우 인터프리터는 GIL을 릴리스하고 다른 스레드에 줄 수 있습니까? 또는 GIL을 얻은 C 스레드는 PyEval_EvalCode
이 반환되고 GIL이 C에서 명시 적으로 릴리스 될 때까지 GIL을 영구적으로 유지합니까?
PyGILState gstate = PyGILState_Ensure();
....
/* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */
PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict);
PyGILState_Release(gstate);
내 [관련 질문] (http://stackoverflow.com/questions/29317120/forcing-a-thread-to-block-all-other-threads-from-executing)을 참조하십시오. 귀하의 진술과 Python Cookbook의 진술 사이의 불일치를 해결하는 방법을 이해하지 못합니다. – max
[Albert 's answer] (http://stackoverflow.com/a/29328066)를 참조하십시오. –