Es gibt viele Methoden für Multi-Process Pool in Python3 und ich wusste nicht, welche ich verwenden sollte, also habe ich nachgeschlagen.
Die Kartenfunktion wird blockiert, bis alle Ergebnisse verfügbar sind.
Wenn ich den Code ausführe
map.py
from multiprocessing import Pool
from time import sleep
import time
start = time.time()
def do(waitTime):
print("do waitTime:{}Von Anfang an{}Sekunden sind vergangen".format(waitTime,time.time() - start))
sleep(waitTime)
return waitTime
if __name__ == '__main__':
waitTimes = [3,2,1]
with Pool(10) as p:
for result in p.map(do,waitTimes):
print("result waitTime:{}Von Anfang an{}Sekunden sind vergangen".format(result,time.time() - start))
Ergebnis ist
do waitTime:3 0 von Anfang an.035417079925537 11 Sekunden sind vergangen
do waitTime:2 0 von Anfang an.03555130958557129 Sekunden sind vergangen
do waitTime:1 von Anfang an 0.03568387031555176 Sekunden sind vergangen
result waitTime:3 von Anfang an 3.0372514724731445 Sekunden sind vergangen
result waitTime:2 von Anfang an 3.0373241901397705 Sekunden sind vergangen
result waitTime:1 von Anfang an 3.037338972091675 Sekunden vergangen
for result in p.map (do, waitTimes):
Der Rückgabewert der Zeile ist vom Typ list ** Die for-Anweisung wird erst ausgeführt, wenn alle Prozesse abgeschlossen sind **
Die Imap-Funktion ist eine verzögerte Auswertungsversion der Kartenfunktion. Der Rückgabewert der imap-Funktion gibt einen Iterator zurück. Wenn es einen Prozess gibt, dessen Rückgabewert festgelegt ist, kann die for-Anweisung ausgeführt werden, ohne auf den Abschluss anderer Prozesse zu warten. Wenn der erste Prozess jedoch aufgrund der Einschränkung, dass er in derselben Reihenfolge zurückgegeben werden muss, in der er übergeben wurde, nicht beendet wird, wird die for-Anweisung auch dann nicht auf unbestimmte Zeit ausgeführt, wenn eine andere Verarbeitung abgeschlossen ist.
imap.py
from multiprocessing import Pool
from time import sleep
import time
start = time.time()
def do(waitTime):
print("do waitTime:{}Von Anfang an{}Sekunden sind vergangen".format(waitTime,time.time() - start))
sleep(waitTime)
return waitTime
if __name__ == '__main__':
waitTimes = [3,2,1]
with Pool(10) as p:
for result in p.imap(do,waitTimes):
print("result waitTime:{}Von Anfang an{}Sekunden sind vergangen".format(result,time.time() - start))
do waitTime:3 0 von Anfang an.03740239143371582 Sekunden sind vergangen
do waitTime:2 0 von Anfang an.03748369216918945 Sekunden sind vergangen
do waitTime:1 von Anfang an 0.0376131534576416 Sekunden sind vergangen
result waitTime:3 von Anfang an 3.041029930114746 Sekunden vergangen
result waitTime:2 von Anfang an 3.041118621826172 Sekunden sind vergangen
result waitTime:1 von Anfang an 3.0411417484283447 Sekunden sind vergangen
Es ist dasselbe wie imap (), außer dass die Reihenfolge der vom Iterator zurückgegebenen Ergebnisse als willkürlich angesehen wird.
imap.py
from multiprocessing import Pool
from time import sleep
import time
start = time.time()
def do(waitTime):
print("do waitTime:{}Von Anfang an{}Sekunden sind vergangen".format(waitTime,time.time() - start))
sleep(waitTime)
return waitTime
if __name__ == '__main__':
waitTimes = [3,2,1]
with Pool(10) as p:
for result in p.imap_unordered(do,waitTimes):
print("result waitTime:{}Von Anfang an{}Sekunden sind vergangen".format(result,time.time() - start))
do waitTime:3 0 von Anfang an.03511857986450 195 Sekunden vergangen
do waitTime:2 0 von Anfang an.035273075103759766 Sekunden vergangen
do waitTime:1 von Anfang an 0.035429954528808594 Sekunden sind vergangen
result waitTime:1 von Anfang an 1.0369133949279785 Sekunden sind vergangen
result waitTime:2 von Anfang an 2.0377516746520996 Sekunden vergangen
result waitTime:3 von Anfang an 3.038750171661377 Sekunden sind vergangen
Hoppla! Wenn ein Prozess die Verarbeitung abgeschlossen hat, wird er ausgeführt, ohne auf eine andere Verarbeitung zu warten!
Python 3-Multi-Prozess-Pool-Methoden sollten imap_unordered verwenden
Recommended Posts