2009-10-16 5 views
6

저는 SWIG를 사용하여 파이핑하여 사용하는 C++로 작성된 라이브러리를 가지고 있습니다. 일반적으로 메소드가 거의없는 클래스가 하나 있습니다. 문제는 이러한 메서드를 호출하는 데 시간이 많이 걸릴 수 있습니다 - 응용 프로그램이 멈출 수 있습니다 (GIL은 이러한 메서드를 호출 할 때 해제되지 않음). 그래서 내 질문 :C++ 코드에서 Python GIL 릴리스

이러한 메서드 호출에 대한 GIL을 해제하는 가장 간단한 방법은 무엇입니까?

는 (I 내가 C 라이브러리를 사용하는 경우 내가 몇 가지 추가 C 코드로이 래핑 수 있다고 이해하지만, 나는 여기 C++ 및 클래스 사용) 당신은 C. 차이와 동일한 API 호출을 사용할 수 있습니다

답변

1

합니다. "python.h"를 포함하고 appoproate 함수를 호출하십시오.

또한 SWIG에 typemap이나 GIL shuold가 특정 기능에 대해 보유되지 않음을 나타내는 내용이 없는지 확인하십시오.

5

꿀꺽 꿀꺽 내가/취득 어쨌든 답변 : 자료에이 같은

사용 무언가를 시도 할거야 GIL 무엇인지 어떤 생각을 가지고 있지 :

class GILReleaser { 
    GILReleaser() : save(PyEval_SaveThread()) {} 

    ~GILReleaser() { 
     PyEval_RestoreThread(save); 
    } 

    PyThreadState* save; 
}; 

과의 코드 블록

당신의 , 해제 RAII를 활용 선택/GIL을 획득 :

{ 
    GILReleaser releaser; 
    // ... Do stuff ... 
} 
+0

감사합니다. – Ellioh

5

진짜 문제는 꿀꺽 꿀꺽 잘 문서화되어 있지 않습니다 (I 검색에 대한 변경 로그를 사용하는 힌트를 보았다)이다).

좋아, 내가 꿀꺽 꿀꺽에서 인라인 기능을하고 GIL을 획득/해제 매크로를 사용할 수 있다는 것을 발견, 그것은 다음과 같습니다

%inline %{ 
    void wrappedFunction(OriginalObject *o, <parameters>) { 
    Py_BEGIN_ALLOW_THREADS 
    o->originalFunction(<parameters>); 
    Py_END_ALLOW_THREADS 
} 
%} 

이 기능을 사용하지 ++ 원래 C에 존재하지만, 사용할 수 있습니다 파이썬 모듈. 이것은 (거의) 정확히 내가 원했던 것입니다. (내가 원하는 것은 파이썬 장식 자 같은 원래의 방법을 감싸는 것입니다.)

+0

헨릭을 사용하십시오. 이것은 맞지만 나쁜 C++ 연습입니다. 또한 나는 GIL을 공개 한 후 dict에서 데이터를 추출하는 충돌이 있었기 때문에 일반적으로 GIL 릴리스와 재 획득 사이에 python.h의 함수를 사용하지 않았습니다. –