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 :
Ich habe ein paar Probleme / Fragen:
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?
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?
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?
Die Verwendung von Lock
kann bei der Synchronisation helfen:
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
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:
Jetzt enthält q
das aktualisierte und zurückgegebene dict
von p_capture()
und p_get_reading()
.
Tags und Links python python-3.x multiprocessing python-multithreading python-multiprocessing