Les méthodes de pool multi-processus Python 3 doivent utiliser imap_unordered

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.

fonction de carte

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 **

fonction imap

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

fonction imap_unordered

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!

Résumé

Les méthodes de pool multi-processus Python 3 doivent utiliser imap_unordered

Recommended Posts

Les méthodes de pool multi-processus Python 3 doivent utiliser imap_unordered
[Python] À propos du multi-processus
Vous devez savoir si vous utilisez Python! 10 bibliothèques utiles
Trois raisons pour lesquelles les apprenants en machine learning devraient utiliser Python
Utilisez Thingsspeak de Python
Utilisez config.ini avec Python
Utiliser fluentd de python
Utiliser des dates en Python
Méthodes pratiques de Python, etc.
[python] méthode de base de la classe
Utiliser Valgrind avec Python
Utilisez MySQL depuis Python
Utiliser mecab avec Python 3
Utiliser le client LiquidTap Python ③
Utiliser DynamoDB avec Python
Multi-processus de manière asynchrone avec python
Utilisez Python 3.8 avec Anaconda
Utilisation méthodique du format [Python]
Utiliser python avec docker
Utiliser MySQL depuis Python
Utiliser le client LiquidTap Python ②
Utilisez BigQuery depuis Python.
Utiliser le profileur en Python
Utilisez mecab-ipadic-neologd de Python
Utiliser le client LiquidTap Python ①