2010-03-24 5 views
1

SWIG에서 기존 C++ 라이브러리 live555 (RTSP 클라이언트 인터페이스를 특정하게 래핑)을 파이썬 확장으로 작성했습니다. 이 확장은 단일 스레드에서 작동하지만 라이브러리의 이벤트 루프 함수를 호출하자마자 파이썬 인터프리터는 제어권을 다시 얻지 못합니다. 따라서 이벤트 루프를 호출하기 직전에 threading.Timer을 사용하여 예약 된 작업을 만들면 이벤트 루프가 시작되면 해당 작업이 실행되지 않습니다. 이 문제를 해결하기 위해 모든 doEventLoop() 함수 호출을 중심으로 SWIG 자동 생성 래퍼 cxx 파일에 Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS 매크로를 수동으로 추가했습니다. 하지만 이제는 SWIG가 코드 자체를 생성하고 어떤 코드도 수동으로 변경하지 않을 때도 동일한 작업 (즉 스레드 허용)을 수행하려고합니다. SWIG에서 비슷한 일을 한 사람 있습니까?SWIG를 사용하여 생성 된 파이썬 확장 모듈에서 블로킹 I/O 코드를 호출 한 후 파이썬에서 스레드 허용

P. - 나는 또한 다른 프레임 워크 (SIP 같은)로 전환하여이 작업을 수행하는 것을 고려할 것입니다. SWIG 인터페이스를 작성하는 것이 정말 쉽고 기존 헤더 파일을 포함시켜야하기 때문에 다른 어떤 기술보다 SWIG를 선택했습니다.

+0

ctypes를 사용하여 C DLL을 호출하면 GIL이 자동으로 해제됩니다. ctypes를 사용 했습니까? – FogleBird

+0

@FogleBird 나는 ctypes가 C 라이브러리가 아니라 C++에서만 작동한다고 생각했습니다. 나는 그 점을 더 깊이 조사 할 것이다. –

+0

오, 그래, C + +가 더 까다 롭고 나는 ctypes에서 처리하지 않았습니다. 미안해, 너에게 더 좋은 대답이 없어. – FogleBird

답변

3

SWIG는 이러한 일이 일어나도록 많은 후크를 제공합니다.

%exception { 
    Py_BEGIN_ALLOW_THREADS 
    $action 
    Py_END_ALLOW_THREADS 
} 

이 (AB) C 함수 호출을 장식하기위한 꿀꺽 꿀꺽 기능을 사용 : 거친 솔루션은 사용자의 요구에 충분하다면, 내가 과거에했던 한 가지 내 .swig 파일에 이런 식으로 뭔가를 넣어 GIL 잠금 해제/잠금 기능을 사용하여 이러한 호출을 꾸미기 위해 오류 처리 논리를 사용합니다. 여기서 일어나는 일에 대한 자세한 내용은 SWIG 문서의 Exception handling with %exception을 참조하십시오.