Zulassen Fäden von Python nach dem Aufruf eine Blockierung i / o-Code in einer Python-Erweiterung generiert mit SWIG

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

  •  22-09-2019
  •  | 
  •  

Frage

Ich habe eine Python-Erweiterung Umwickeln einen vorhandenen C ++ geschrieben Bibliothek LIVE555 (Verpackung RTSP-Client-Schnittstelle spezifisch sein) in SWIG . Die Erweiterung funktioniert, wenn es in einem einzigen Thread betrieben wird, aber sobald ich die Ereignisschleife Funktion der Bibliothek aufrufen, Python-Interpreter wird nie die Kontrolle zurück. Also, wenn ich eine geplante Aufgabe mit threading.Timer Recht erstellen, bevor die Ereignisschleife aufrufen, diese Aufgabe nicht ein einziges Mal Ereignisschleife beginnt ausgeführt wird. Um dieses Problem zu beheben, habe ich Py_BEGIN_ALLOW_THREADS und Py_END_ALLOW_THREADS Makros manuell in der SWIG automatisch generierten Wrapper cxx Datei um jeden doEventLoop() Funktionsaufruf. Aber jetzt möchte ich das gleiche tun (das heißt Gewinde erlaubt), wenn SWIG den Code selbst erzeugt und keinen Code manuell zu ändern. Hat jemand etwas ähnliches in SWIG getan?

P. S. - Ich würde auch zu jedem anderen Rahmen Schale (wie SIP) diese Funktion zu erhalten. Wie wähle ich die SWIG über jede andere Technologie ist, weil das Schreiben SWIG Schnittstelle ist wirklich sehr einfach und ich nur die vorhandenen Header-Dateien mussten schließen.

War es hilfreich?

Lösung

SWIG gibt Ihnen genügend Haken zu helfen, damit dies geschieht. Wenn eine grobe Lösung für Ihre Bedürfnisse ausreichend ist, eine Sache, die ich in der Vergangenheit getan habe, ist, geben Sie etwas wie dies in meiner .swig-Datei:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

Das (ab) verwendet die SWIG Anlage für C-Funktionsaufrufe Dekoration mit irgendeiner Art von Fehlerbehandlungslogik, um diese Anrufe mit einer GIL unlock / Sperre zu dekorieren. Siehe Ausnahmebehandlung mit Ausnahme% in der SWIG-Dokumentation für Details auf, was denn hier los.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top