Frage

Ich habe eine Python-GUI-Anwendung, die eine lange Lauffunktion von einem uses .so / .dll es durch ctypes nennt.

Ich bin auf der Suche nach einer Möglichkeit, mit der Funktion zu kommunizieren, während es in einem separaten Thread oder Prozess ausgeführt, so dass ich verlangen kann es früh zu beenden (was einige Arbeit auf der C-Seite erfordert, bevor ein Teilergebnis der Rückkehr). Ich nehme an, dies wird eine Art von Signal benötigen empfängt oder aus Rohren zu lesen, aber ich mag es halten so einfach wie möglich.

Was würden Sie als den besten Ansatz, diese Art von Problem zu lösen? Ich bin in der Lage, den Code zu ändern, sowohl auf den Python und C Seiten.

War es hilfreich?

Lösung

Es gibt zwei Teile Sie hier beantworten müssen: eine, wenn, wie zwischen den beiden Prozessen (Ihre GUI und den Prozess der Ausführung der Funktion) zu kommunizieren, und das andere ist, wie Sie Ihre Funktion zu ändern, damit es auf asynchrone Anfragen antwortet ( „Oh, ich habe gesagt, nur zurückgeben, was ich habe“).

, um die Antwort auf die zweite Frage Ausarbeiten wird wahrscheinlich die Antwort auf den ersten diktieren. Man könnte es durch Signale tun (in dem Fall, dass Sie ein Signal-Handler erhalten, die Steuerung des Prozesses wird, können für detailliertere Anweisungen an anderer Stelle, und Ihre internen Datenstrukturen ändern, bevor die Steuerung an die Funktion zurückkehrt), oder Sie können Ihre Funktion haben überwachen, um eine Steuerschnittstelle für Befehle (jede Millisekunde, um zu sehen, ob es ein Befehl Warte ist, und wenn ja, sehen, was es ist).

Im ersten Fall würden Sie ANSI-C-Signal wollen Handling (Signal (), sighandler_t), in den zweiten Sie wahrscheinlich würde will ein Rohr oder ähnliches (Rohr (), und wählen Sie ()).

Andere Tipps

Sie erwähnen, dass Sie sowohl die C und Python Seiten ändern kann. Um zu vermeiden, in C keine Steckdosen oder Signalcode zu schreiben, könnte es am einfachsten, die großen C-Funktion in 3 kleinere separate Funktionen zu brechen, dass das Setup, ein kleines Paket von der Arbeit, und die Bereinigung durchzuführen. Das Arbeitspaket soll zwischen etwa 1 ms und 1 Sekunde Laufzeit sein, ein Gleichgewicht zwischen Ansprechverhalten und geringen Overhead zu schlagen. Es kann hart sein, Berechnungen zu brechen in noch Brocken wie dies angesichts der Datengrößen zu ändern, aber Sie würden die gleiche Herausforderung in einer einzigen großen Funktion haben, die auch ich habe / O.

einen Arbeitsprozess in Python schreiben, die diese drei Funktionen durch ctypes aufruft. Lassen Sie den Arbeitsprozess überprüfen Queue Objekt für eine Nachricht von der GUI die Berechnung zu stoppen früh. Achten Sie auf den nicht-blockierende Queue.get_nowait Anruf statt Queue.get verwenden. Wenn der Arbeitsprozess eine Nachricht früh beenden findet, rufen Sie die C bis Code reinigen und das Teil-Ergebnis zurück.

Wenn Sie auf * nichts sind ein Signal-Handler für SIGUSR1 oder SIGINT in Ihrem C-Programm registriert dann von Python verwenden os.kill das Signal zu senden.

Sie haben es gesagt:. Signale und Leitungen

Es muss nicht zu komplex sein, aber es wird eine verdammt viel einfacher, wenn Sie eine vorhandene Struktur, als wenn Sie versuchen, Ihre eigene Rolle.

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