J'ai écrit une extension python enveloppant une bibliothèque C++ existante live555 (enveloppe l'interface client RTSP pour être spécifique) dans SWIG. L'extension fonctionne quand elle est utilisée dans un seul thread, mais dès que j'appelle la fonction de boucle d'événements de la bibliothèque, l'interpréteur python ne récupère jamais le contrôle. Donc, si je crée une tâche planifiée en utilisant threading.Timer
juste avant d'appeler la boucle d'événement, cette tâche ne sera jamais exécutée une fois que la boucle d'événements commencera. Pour résoudre ce problème, j'ai ajouté manuellement les macros Py_BEGIN_ALLOW_THREADS
et Py_END_ALLOW_THREADS
dans le fichier cxx wrapper généré automatiquement par SWIG autour de chaque appel de fonction doEventLoop()
. Mais maintenant, je veux faire la même chose (c'est-à-dire autoriser les threads) quand SWIG génère le code lui-même et ne pas changer de code manuellement. Quelqu'un at-il fait quelque chose de similaire dans SWIG?Autorisation des threads de python après l'appel d'un code d'E/S bloquant dans une extension python générée en utilisant SWIG
P.S. - Je voudrais également envisager de passer à un autre cadre (comme SIP) pour que cela fonctionne. J'ai choisi SWIG sur n'importe quelle autre technologie parce que l'écriture de l'interface SWIG était vraiment très simple et que je devais simplement inclure les fichiers d'en-tête existants. SWIG vous donne beaucoup de crochets pour aider à ce que cela se produise.
Si vous utilisez ctypes pour appeler dans une DLL C, il libérera le GIL automatiquement. Avez-vous envisagé d'utiliser des ctypes? – FogleBird
@FogleBird Je pensais que ctypes ne fonctionne que pour la bibliothèque C, pas C++. Je vais enquêter plus sur cela. –
Oh oui, C++ est plus compliqué et je ne l'ai pas traité en ctypes. Désolé, je n'ai pas de meilleure réponse pour vous. – FogleBird