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: p>
Quel est le moyen le plus simple de libérer GIL pour ces appels de méthode? p>
(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) P>
3 Réponses :
Vous pouvez utiliser le même appel d'API que pour C. Aucune différence. Inclure "python.h" et appelez la fonction Appopoate. P>
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. P>
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 ...
}
Merci, tu m'as sauvé un peu de temps.
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: p> 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) p> p>
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.