7
votes

Libérer python gil en code C ++

J'ai une bibliothèque écrite en C ++ que je enveloppe à l'aide de Swig et d'utiliser dans Python. Généralement, il y a une classe avec peu de méthodes. Le problème est que l'appel de ces méthodes peut consommer du temps - ils peuvent accrocher ma demande (GIL n'est pas libéré lors de l'appel de ces méthodes). Donc, ma question est:

Quel est le moyen le plus simple de libérer GIL pour ces appels de méthode?

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


0 commentaires

3 Réponses :


0
votes

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

Aussi, voir si Swig n'a pas de type de type ou quelque chose pour indiquer que le gil shuold ne peut pas être détenu pour une fonction spécifique.


0 commentaires

9
votes

Ne pas avoir aucune idée de ce que Swig est je tenterai une réponse quand même :)

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

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


1 commentaires

Merci, tu m'as sauvé un peu de temps.



9
votes

Le problème réel est que Swig n'est pas bien documenté (j'ai vu des astuces pour 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: xxx

Cette fonction n'est pas présente Dans l'original C ++, mais disponible dans le module Python. C'est (presque) exactement ce que je voulais. (Ce que je voudrais, c'est d'envelopper la méthode d'origine comme le décorateur de python)


1 commentaires

Utilisez Henrik's. C'est vrai, mais c'est une mauvaise pratique C ++. De plus, j'avais un crash d'extraction de données d'une dicte après avoir relâché le gil, donc je n'utilise généralement aucune fonction de Python.h entre la libération de Gil et Reacquire.