2009-10-16 6 views
6

Ich habe eine Bibliothek in C++ geschrieben, die ich mit SWIG umschlingen und in Python verwenden. Im Allgemeinen gibt es eine Klasse mit wenigen Methoden. Das Problem ist, dass das Aufrufen dieser Methoden zeitaufwendig sein kann - sie können meine Anwendung hängen lassen (GIL wird nicht freigegeben, wenn diese Methoden aufgerufen werden). Also meine Frage ist:Freigabe von Python GIL in C++ Code

Was ist der einfachste Weg, GIL für diese Methodenaufrufe freigeben?

(Ich verstehe, dass, wenn ich eine C-Bibliothek verwende ich dies mit einigem zusätzlichen C-Code wickeln könnte, aber hier verwende ich C++ und Klassen)

Antwort

1

Sie den gleichen API-Aufruf als für C. Keinen Unterschied verwenden können. Fügen Sie "python.h" ein und rufen Sie die Funktion appoproate auf.

Überprüfen Sie auch, ob SWIG keine typeMap hat oder etwas, das anzeigt, dass die GIL nicht für eine bestimmte Funktion gehalten wird.

5

mit keine Ahnung, was SWIG ist ich sowieso eine Antwort versuchen werde :)

Verwendung so etwas zu veröffentlichen/erwerben die GIL:

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

    ~GILReleaser() { 
     PyEval_RestoreThread(save); 
    } 

    PyThreadState* save; 
}; 

Und im Code-Block Ihrer Aussuchen, verwenden RAII GIL freizugeben/erwerben:

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

Danke, Sie haben mir etwas Zeit gespart. – Ellioh

5

Das eigentliche Problem ist, dass SWIG nicht gut dokumentiert ist (ich sah Hinweise Changelog für die Suche zu verwenden;)).

Ok, ich fand heraus, dass ich Inline-Funktionen in SWIG tun können, und Makros freigeben/erwerben GIL, sieht es wie folgt aus:

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

Diese Funktion ist nicht in original C++, aber in Python-Modul. Das ist (fast) genau das, was ich wollte. (Was ich möchte ist original Methode wie Python Decorator wickeln)

+0

Verwenden Sie Henriks. Das ist richtig, aber schlechte C++ Praxis. Ich hatte auch einen Absturz bei der Extraktion von Daten aus einem Diktat nach der Veröffentlichung der GIL, so dass ich im Allgemeinen keine Funktionen von python.h zwischen GIL release und reacquire verwende. –