2009-10-16 16 views
6

Mam bibliotekę napisaną w C++, którą otulam używając SWIG i używam w pythonie. Zasadniczo istnieje jedna klasa z kilkoma metodami. Problem polega na tym, że wywoływanie tych metod może być czasochłonne - mogą zawiesić moją aplikację (GIL nie jest zwalniany podczas wywoływania tych metod). Więc moje pytanie brzmi:Wydanie Pythona GIL w kodzie C++

Jaki jest najprostszy sposób na uwolnienie GIL dla tych wywołań metod?

(rozumiem, że jeśli kiedyś bibliotekę C mogę owinąć to z pewnym dodatkowym kodem C, ale tutaj używam C++ i klasach)

Odpowiedz

1

można użyć tego samego połączenia interfejsu API dla C żadnej różnicy. Dołącz "python.h" i wywołaj funkcję appoproate.

Zobacz również, czy SWIG nie ma typografii lub czegoś, co wskazuje, że GIL shuold nie ma być trzymany dla określonej funkcji.

5

Nie mając pojęcia, co jest SWIG będę próbować odpowiedź w każdym razie :)

użyć czegoś takiego, aby zwolnić/nabyć GIL:

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

    ~GILReleaser() { 
     PyEval_RestoreThread(save); 
    } 

    PyThreadState* save; 
}; 

iw kodzie bloku twojego wyboru, aby wykorzystać RAII uwolnienie/nabyć GIL:

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

Dzięki, zaoszczędziłeś mi trochę czasu. – Ellioh

5

prawdziwym problemem jest to, że nie jest to udokumentowane SWIG dobrze (widziałem wskazówek do wykorzystania changelog do przeszukiwania;)).

Ok, dowiedziałem się, że mogę zrobić funkcji wbudowanych w SWIG i korzystać z makr, aby zwolnić/nabyć GIL, wygląda to tak:

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

Funkcja ta nie występuje w oryginalnym języku C++, ale dostępne w moduł python. To jest (prawie) dokładnie to, co chciałem. (Chciałem owinąć oryginalną metodę, taką jak python decorator).

+0

Użyj Henrika. To prawda, ale jest to zła praktyka C++. Miałem także awarię wyodrębniania danych z dyktatury po zwolnieniu GIL, więc generalnie nie używam żadnych funkcji z Pythona.h pomiędzy wersją GIL a ponownym jej pozyskaniem. –

Powiązane problemy