Il existe de nombreuses méthodes de pool multi-processus dans Python3 et je ne savais pas laquelle utiliser, alors je l'ai recherchée.
La fonction de carte se bloque jusqu'à ce que tous les résultats soient disponibles.
Quand j'exécute le code
map.py
from multiprocessing import Pool
from time import sleep
import time
start = time.time()
def do(waitTime):
print("do waitTime:{}Depuis le début{}Les secondes ont passé".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:{}Depuis le début{}Les secondes ont passé".format(result,time.time() - start))
Le résultat est
do waitTime:3 0 depuis le début.035417079925537 11 secondes se sont écoulées
do waitTime:2 0 depuis le début.03555130958557129 secondes se sont écoulées
do waitTime:1 depuis le début 0.03568387031555176 secondes se sont écoulées
result waitTime:3 depuis le début 3.0372514724731445 secondes se sont écoulées
result waitTime:2 depuis le début 3.0373241901397705 secondes se sont écoulées
result waitTime:1 depuis le début 3.037338972091675 secondes écoulées
for result in p.map (do, waitTimes):
La valeur de retour de la ligne est de type list ** l'instruction for ne sera pas exécutée tant que tous les processus ne seront pas terminés **
La fonction imap est une version d'évaluation différée de la fonction de carte. La valeur de retour de la fonction imap renvoie un itérateur. S'il existe un processus dont la valeur de retour est fixe, l'instruction for peut être exécutée sans attendre l'achèvement des autres processus. Cependant, si le premier processus n'est pas interrompu en raison de la restriction selon laquelle il doit être renvoyé dans le même ordre qu'il a été passé, l'instruction for ne sera pas exécutée indéfiniment, même si un autre traitement est terminé.
imap.py
from multiprocessing import Pool
from time import sleep
import time
start = time.time()
def do(waitTime):
print("do waitTime:{}Depuis le début{}Les secondes ont passé".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:{}Depuis le début{}Les secondes ont passé".format(result,time.time() - start))
do waitTime:3 0 depuis le début.03740239143371582 secondes se sont écoulées
do waitTime:2 0 depuis le début.03748369216918945 secondes se sont écoulées
do waitTime:1 depuis le début 0.0376131534576416 secondes se sont écoulées
result waitTime:3 depuis le début 3.041029930114746 secondes passées
result waitTime:2 depuis le début 3.041118621826172 secondes se sont écoulées
result waitTime:1 depuis le début 3.0411417484283447 secondes se sont écoulées
C'est la même chose que imap (), sauf que l'ordre des résultats renvoyés par l'itérateur est considéré comme arbitraire.
imap.py
from multiprocessing import Pool
from time import sleep
import time
start = time.time()
def do(waitTime):
print("do waitTime:{}Depuis le début{}Les secondes ont passé".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:{}Depuis le début{}Les secondes ont passé".format(result,time.time() - start))
do waitTime:3 0 depuis le début.03511857986450 195 secondes passées
do waitTime:2 0 depuis le début.035273075103759766 secondes passées
do waitTime:1 depuis le début 0.035429954528808594 secondes se sont écoulées
result waitTime:1 depuis le début 1.0369133949279785 secondes se sont écoulées
result waitTime:2 depuis le début 2.0377516746520996 secondes passées
result waitTime:3 depuis le début 3.038750171661377 secondes se sont écoulées
Oups! S'il y a un processus qui a terminé le traitement, il sera exécuté sans attendre d'autres traitements!
Les méthodes de pool multi-processus Python 3 doivent utiliser imap_unordered
Recommended Posts