Permettre aux discussions de python après avoir appelé un blocage i / o code dans une extension de python généré en utilisant SWIG

StackOverflow https://stackoverflow.com/questions/2510696

  •  22-09-2019
  •  | 
  •  

Question

J'ai écrit une extension python enveloppant une bibliothèque C ++ existant LIVE555 (emballage interface client RTSP pour être précis) dans SWIG . L'extension fonctionne lorsqu'il fonctionne dans un seul fil, mais dès que j'appelle la fonction de boucle d'événements de la bibliothèque, l'interpréteur python ne fait jamais le contrôle en arrière. Donc, si je crée une tâche planifiée à l'aide threading.Timer droite avant d'appeler la boucle d'événements, cette tâche ne sera exécuté une fois la boucle d'événement démarre. Pour résoudre ce problème, j'ai ajouté des macros Py_BEGIN_ALLOW_THREADS et Py_END_ALLOW_THREADS manuellement dans l'emballage généré automatiquement SWIG fichier cxx autour de chaque appel de la fonction doEventLoop(). Mais maintenant, je veux faire la même chose (à savoir permettre à des fils) lorsque SWIG génère le code lui-même et de ne pas changer de code manuellement. Quelqu'un at-il fait quelque chose de similaire à SWIG?

P.S. - Je considère également le passage à tout autre cadre (comme SIP) pour obtenir ce travail. J'ai choisi SWIG sur toute autre technologie est parce que l'écriture interface SWIG était vraiment très facile et je viens d'avoir à inclure les fichiers d'en-tête existants.

Était-ce utile?

La solution

SWIG vous donne beaucoup de crochets pour aider à y arriver. Si une solution grossière est suffisante pour vos besoins, une chose que je l'ai fait dans le passé est mis quelque chose comme ça dans mon dossier .swig:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

(ab) utilise l'installation SWIG pour la décoration de la fonction C appelle avec une sorte de logique de gestion des erreurs afin de décorer ces appels avec un déverrouillage / verrouillage de GIL. Voir Gestion des exceptions à% exception dans les SWIG docs pour plus de détails sur ce qui est se passe ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top