일부 I/O 작업 (파일, 표준 출력)을 한 번에 수행하는 클래스의 Python 메소드를 호출하는 C++ 클래스를 작성하려고합니다. 내가 겪었던 문제는 클래스가 다른 스레드에서 호출된다는 것입니다 : 때때로 메인 스레드, 때로는 다른 스레드. 분명히 다중 스레드 네이티브 응용 프로그램에서 파이썬 호출에 대한 접근 방식을 적용하려고했습니다. 기본적으로 모든 것은 PyEval_AcquireLock과 PyEval_ReleaseLock 또는 전역 잠금에서부터 시작됩니다. 문서 here에 따르면 스레드가 이미 잠겨있을 때 교착 상태가 발생합니다. 내 수업이 주 스레드 또는 Python 실행을 차단하는 다른 스레드에서 호출 될 때 교착 상태가 발생합니다.C++ app의 Python C API - 잠글 때 알아보기
파이썬> Cfunc1() - "내 수업", 그것은 PyEval_AcquireLock에 붙어 의 호출로 이어질 내부적으로 쓰레드를 생성 C++ FUNC은 분명히 파이썬은 이미 완료 C++ Cfunc1의 전화를 기다리고 즉, 잠겨 ... 이러한 잠금을 생략하면 정상적으로 완료됩니다. 또한 파이썬 인터프리터가 다음 사용자 명령에 대한 준비가되었을 때, 즉 스레드가 백그라운드에서 func을 호출 할 때 (기본 호출의 내부가 아닌) 완료되면
해결 방법을 찾고 있습니다. 전역 잠금이 허용되는지 여부를 구별해야합니다. 즉, Python이 잠겨 있지 않고 다음 명령을받을 준비가되지 않았는지 ... PyGIL_Ensure를 시도했지만, 불행히도 정지가 발생했습니다.
알려진 API 또는 해결 방법은 무엇입니까?
(파이썬 2.4) 당신은 매우 개인적으로 당신의 C++ 코드를 포장하지 않는 한
메인 스레드에서 처리되는 메시지를 보내는 메시지 펌프가 있습니까? – kibibu
스레드가 생성되는 방법을 명확히 할 수 있습니까? 그들은 Python API를 통해 생성됩니까? –