SWIG에서 기존 C++ 라이브러리 live555 (RTSP 클라이언트 인터페이스를 특정하게 래핑)을 파이썬 확장으로 작성했습니다. 이 확장은 단일 스레드에서 작동하지만 라이브러리의 이벤트 루프 함수를 호출하자마자 파이썬 인터프리터는 제어권을 다시 얻지 못합니다. 따라서 이벤트 루프를 호출하기 직전에 threading.Timer
을 사용하여 예약 된 작업을 만들면 이벤트 루프가 시작되면 해당 작업이 실행되지 않습니다. 이 문제를 해결하기 위해 모든 doEventLoop()
함수 호출을 중심으로 SWIG 자동 생성 래퍼 cxx 파일에 Py_BEGIN_ALLOW_THREADS
및 Py_END_ALLOW_THREADS
매크로를 수동으로 추가했습니다. 하지만 이제는 SWIG가 코드 자체를 생성하고 어떤 코드도 수동으로 변경하지 않을 때도 동일한 작업 (즉 스레드 허용)을 수행하려고합니다. SWIG에서 비슷한 일을 한 사람 있습니까?SWIG를 사용하여 생성 된 파이썬 확장 모듈에서 블로킹 I/O 코드를 호출 한 후 파이썬에서 스레드 허용
P. - 나는 또한 다른 프레임 워크 (SIP 같은)로 전환하여이 작업을 수행하는 것을 고려할 것입니다. SWIG 인터페이스를 작성하는 것이 정말 쉽고 기존 헤더 파일을 포함시켜야하기 때문에 다른 어떤 기술보다 SWIG를 선택했습니다.
ctypes를 사용하여 C DLL을 호출하면 GIL이 자동으로 해제됩니다. ctypes를 사용 했습니까? – FogleBird
@FogleBird 나는 ctypes가 C 라이브러리가 아니라 C++에서만 작동한다고 생각했습니다. 나는 그 점을 더 깊이 조사 할 것이다. –
오, 그래, C + +가 더 까다 롭고 나는 ctypes에서 처리하지 않았습니다. 미안해, 너에게 더 좋은 대답이 없어. – FogleBird