2016-07-26 10 views
0

den Subprozess-Modul verwenden, ich bin mit 1000 Anrufen (1) parallel schlafen:Parallele Anrufe Schlaf tun aufaddieren nicht

import subprocess 
import time 
start = time.clock() 

procs = [] 
for _ in range(1000): 
    proc = subprocess.Popen(["sleep.exe", "1"]) 
    procs.append(proc) 

for proc in procs: 
    proc.communicate() 

end = time.clock() 
print("Executed in %.2f seconds" % (end - start)) 

Auf meiner 4-Core-Maschine, führt dies zu einer Ausführung Zeit von ein paar Sekunden, weit weniger als ich erwartet hatte (~ 1000s/4).

Wie wird es optimiert? Kommt es auf die Sleep-Implementierung an (diese stammt von den Windows-Git-Executables)?

+2

Nun, natürlich die Ausführungszeiten von Dingen, die parallel passieren nicht summieren. Wenn ich 8 Stunden zur selben Zeit schlafe und 8 Stunden schlafe, vergehen 16 Stunden? – user2357112

+2

Warum haben Sie 500 Sekunden erwartet? –

+0

Wie bist du auf die 500er Figur gekommen? – njzk2

Antwort

1

Dies ist, weil subprocess.Popen(..) ist kein blockierender Anruf. Der Thread löst nur die Erstellung des untergeordneten Prozesses aus und fährt fort. Es wartet nicht auf das Ende.

Mit anderen Worten, Sie spawnen 1000 asynchrone Prozesse in einer Schleife und warten dann auf sie eine nach der anderen später. Dieses asynchrone Verhalten führt zu einer Gesamtlaufzeit von einigen Sekunden.


Aufruf proc.communicate() wartet, bis das Kind Prozess abgeschlossen ist (wird beendet). Nun, wenn Sie die Schlafzeiten wollen aufzuaddieren (minus der Prozess-Erstellung/Zerstörung) Overhead, würden Sie tun:

import subprocess 
import time 
start = time.clock() 

procs = [] 

#Get the start time 
for _ in range(10): 
    proc = subprocess.Popen(["sleep.exe", "1"]) 
    procs.append(proc) 
    proc.communicate() 

#Get the end time 

Ist es hängt von der Schlaf Umsetzung (dieses genommen wird von den Windows-Git-Executables)?

Wie ich oben ausgeführt habe, hat dies nichts mit der Implementierung von Schlaf zu tun.

2

Sleeping benötigt keine Prozessorzeit, daher kann Ihr Betriebssystem mehr als 4 Schlafanforderungen gleichzeitig ausführen, obwohl es nur 4 Kerne hat. Im Idealfall wäre es in der Lage, den gesamten Stapel von 1000 in nur 1 Sekunde zu verarbeiten, aber es gibt viel Aufwand in der Erstellung und dem Abbau der einzelnen Prozesse.