Ausführung von zwei Klassenmethoden gleichzeitig in Python

8

Ich bin sicher, viele ähnliche Fragen wurden schon früher gestellt, aber nachdem ich viele davon gelesen habe, bin ich mir immer noch nicht sicher, was ich tun soll. Also, ich habe ein Python-Skript, um einige externe Instrumente (eine Kamera und ein Leistungsmesser) zu steuern. Ich habe die Klasse für beide Instrumente geschrieben, indem ich die C-Funktionen in den .dll-Dateien mit ctypes aufgerufen habe. Im Moment sieht es ungefähr so ​​aus:

%Vor%

Ich möchte die ersten beiden Zeilen gleichzeitig ausführen. Sowohl newport.get_reading als auch camera.capture benötigen etwa 100ms-1s um ausgeführt zu werden (sie werden für die gleiche Zeit ausgeführt, wenn ich die richtigen Argumente wähle). Ich brauche sie nicht genau zur gleichen Zeit zu starten, aber im Idealfall sollte die Verzögerung kleiner als etwa 10-20% der Gesamtlaufzeit sein (also weniger als 0,2 Sekunden Verzögerung, wenn jeder Vorgang etwa 1 Sekunde dauert). Von dem, was ich gelesen habe, kann ich das Modul multiprocessing verwenden. Also versuche ich so etwas basierend auf diesem posten :

%Vor%

Ich habe ein paar Probleme / Fragen:

  1. Ich muss die Rückgabewerte von beiden Funktionsaufrufen erhalten. Unter Verwendung meiner aktuellen Methode zeigt return_dict nur den Eintrag für capture_img , aber nicht den Zählerstand, warum? Es las auch, dass ich Queue verwenden kann, was ist die beste Methode für meinen aktuellen Zweck?

  2. Wie kann ich wissen, ob beide Funktionen gleichzeitig starten? Ich denke daran, das Modul time zu verwenden, um sowohl die Start- als auch die Endzeit beider Funktionen aufzuzeichnen, eventuell mit Hilfe einer Wrapper-Funktion für die Zeitprotokollierung, aber wird die Verwendung von multiprocessing irgendwelche Einschränkungen beinhalten?

  3. Normalerweise führe ich meinen Code auf einer IDE aus (spyder), und von dem, was ich gelesen habe, muss ich in der Eingabeaufforderung laufen, um die Ausgabe zu sehen (Ich habe einige print-Anweisungen in den Funktionen für Debugging-Zwecke). Kann ich noch in der IDE laufen, damit beide Funktionen gleichzeitig ausgeführt werden?

Physicist 05.02.2018, 13:20
quelle

2 Antworten

3

Die Verwendung von Lock kann bei der Synchronisation helfen:

%Vor%

Die beiden Process -Objekte können nun in beliebiger Reihenfolge erstellt und start() ed werden, da die Hauptroutine die Sperre bereits erhalten hat. Sobald sie freigegeben sind, kämpfen die beiden Prozesse untereinander, um die Sperre zu übernehmen und freizugeben, und gleichzeitig fast bereit zu sein.

Beachten Sie auch die Verwendung von if __name__ == "__main__" , da dies hilfreich ist, wenn multiprocessing neue Prozesse erstellt.

Ich muss sagen, das scheint ein Missbrauch von Lock

zu sein     
quamrana 05.02.2018 14:14
quelle
1

Eine Antwort auf Ihre erste Frage ist einfach nein, wenn Sie es auf normale Weise tun, aber ja, wenn Sie es wollen. Nein, da die Zielfunktion nicht mit einem return zum Laich-Thread zurück kommunizieren kann. Eine Möglichkeit besteht darin, eine Warteschlange und Wrapper-Funktionen wie folgt zu verwenden:

%Vor%

Jetzt enthält q das aktualisierte und zurückgegebene dict von p_capture() und p_get_reading() .

    
theausome 05.02.2018 16:02
quelle