Druckzeit im Python-Multiprocessing-Skript gibt die abgelaufene negative Zeit zurück

8

Führen Sie es auf Ubuntu 14 mit Python 2.7.6

aus

Ich habe das Skript vereinfacht, um mein Problem zu zeigen:

%Vor%

Und die Ausgabe:

%Vor%

Die Verwendung von time.time() ergibt nicht-negative Werte (wie hier markiert Timer zeigt die abgelaufene negative Zeit ) aber ich bin neugierig, was ist das Problem mit time.clock() in Python multiprocessing und Lesezeit von der CPU.

    
abrasadera 27.04.2014, 12:07
quelle

1 Antwort

10

multiprocessing erzeugt neue Prozesse und time.clock() auf Linux hat die gleiche Bedeutung wie die C clock() :

  

Der zurückgegebene Wert ist die CPU-Zeit, die bisher verwendet wurde als clock_t;

Daher werden die von clock zurückgegebenen Werte von 0 neu gestartet, wenn ein Prozess gestartet wird. Ihr Code verwendet jedoch den Parent -Prozess start_time , um die Zeit zu bestimmen, die im untergeordneten Prozess verbracht wurde. Dies ist offensichtlich falsch, wenn das Kind die CPU-Zeit zurücksetzt.

Die Funktion clock() macht nur Sinn, wenn ein -Prozess behandelt wird, weil ihr Rückgabewert die CPU-Zeit ist, die von diesem Prozess verbraucht wurde. Untergeordnete Prozesse werden nicht berücksichtigt.

Die time() -Funktion dagegen verwendet eine systemweite Uhr und kann daher sogar zwischen verschiedenen Prozessen verwendet werden (obwohl sie nicht monoton ist), so dass sie möglicherweise falsche Ergebnisse zurückgibt ändert die Systemzeit während der Ereignisse).

Das Forking einer laufenden Python-Instanz ist wahrscheinlich schneller als das Starten einer neuen Python-Instanz, daher ist start_time fast immer größer als der von time.clock() zurückgegebene Wert. Berücksichtigen Sie, dass der Parent-Prozess auch Ihre Datei auf dem Datenträger lesen, die Importe ausführen muss, die möglicherweise andere .py -Dateien lesen, Verzeichnisse durchsuchen usw. Die gegabelten Kindprozesse müssen das alles nicht tun.

Beispielcode, der zeigt, dass der Rückgabewert von time.clock() auf 0 zurückgesetzt wird:

%Vor%

Ergebnis:

%Vor%

Beachten Sie, dass t für den Fall lol monoton ist und im anderen Fall wieder 0.001 .

    
Bakuriu 27.04.2014, 15:37
quelle