2009-10-16 15 views
6

J'ai une bibliothèque écrite en C++ que j'emballe en utilisant SWIG et que j'utilise en python. Généralement il y a une classe avec peu de méthodes. Le problème est qu'appeler ces méthodes peut prendre du temps - ils peuvent bloquer mon application (GIL n'est pas libéré lors de l'appel de ces méthodes). Donc ma question est:Libération de Python GIL en code C++

Quelle est la manière la plus simple de libérer GIL pour ces appels de méthode?

(Je comprends que si j'ai utilisé une bibliothèque C je pouvais envelopper cela avec un code supplémentaire C, mais ici j'utiliser C++ et les classes)

Répondre

1

Vous pouvez utiliser le même appel API que pour C. Aucune différence. Incluez "python.h" et appelez la fonction appoproate.

Également, voir si SWIG ne possède pas de typemap ou quelque chose pour indiquer que le GIL shuold n'est pas détenu pour une fonction spécifique.

5

Ne pas avoir une idée de ce que SWIG est que je vais tenter une réponse de toute façon :)

Utilisez quelque chose comme ceci pour libérer/acquérir le GIL:

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

    ~GILReleaser() { 
     PyEval_RestoreThread(save); 
    } 

    PyThreadState* save; 
}; 

Et dans le code-bloc de votre choix, utiliser RAII pour libérer/acquérir GIL:

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

Merci, vous m'a sauvé un certain temps. – Ellioh

5

Le vrai problème est que SWIG est pas bien documenté (j'ai vu des notes à utiliser changelog pour la recherche;)).

Ok, j'ai découvert que je peux faire des fonctions en ligne dans SWIG et utiliser des macros pour libérer/acquérir GIL, il ressemble à ceci:

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

Cette fonction est présente dans l'original C++, mais disponible en module python. C'est (presque) exactement ce que je voulais. (ce que je voudrais est d'enrouler la méthode originale comme le décorateur de python fait)

+0

Utilisez Henrik. C'est vrai, mais c'est une mauvaise pratique en C++. J'ai aussi eu un crash extrayant des données d'un dict après avoir libéré le GIL, donc je n'utilise généralement pas de fonctions de python.h entre la version GIL et reacquire. –