392 votes

Multitraitement python. Piscine : quand utiliser appliquer, apply_async ou carte ?

Je n’ai pas vu des exemples clairs avec les cas d’utilisation pour , et . J’utilise principalement ; Quels sont les avantages des autres ?

548voto

unutbu Points 222216

De retour dans les vieux jours de Python, pour appeler une fonction avec des arguments arbitraires, vous devez utiliser apply:

apply(f,args,kwargs)

apply existe toujours dans Python2.7 mais pas en Python3, et n'est généralement pas utilisé plus. De nos jours,

f(*args,**kwargs)

est préféré. L' multiprocessing.Pool modules tente de fournir une interface similaire.

Pool.apply , c'est comme Python apply, sauf que l'appel de la fonction est exécutée dans un processus séparé. Pool.apply blocs jusqu'à ce que la fonction est terminée.

Pool.apply_async est aussi comme Python intégré dans l' apply, sauf que l'appel renvoie immédiatement au lieu d'attendre le résultat. Un ApplyResult objet est retourné. Vous appelez sa get() méthode pour récupérer le résultat de l'appel de la fonction. L' get() méthode des blocs jusqu'à ce que la fonction est terminée. Ainsi, pool.apply(func, args, kwargs) est équivalent à pool.apply_async(func, args, kwargs).get().

Contrairement aux Pool.apply, Pool.apply_async méthode a aussi un rappel qui, s'il est fourni, est appelée lorsque la fonction est terminée. Ceci peut être utilisé à la place de l'appel d' get().

Par exemple:

import multiprocessing as mp
import time

def foo_pool(x):
    time.sleep(2)
    return x*x

result_list = []
def log_result(result):
    # This is called whenever foo_pool(i) returns a result.
    # result_list is modified only by the main process, not the pool workers.
    result_list.append(result)

def apply_async_with_callback():
    pool = mp.Pool()
    for i in range(10):
        pool.apply_async(foo_pool, args = (i, ), callback = log_result)
    pool.close()
    pool.join()
    print(result_list)

if __name__ == '__main__':
    apply_async_with_callback()

peut produire un résultat comme

[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]

Avis, contrairement à pool.map, de l'ordre des résultats peuvent ne pas correspondre à l'ordre dans lequel l' pool.apply_async des appels ont été lancés.


Donc, si vous avez besoin pour exécuter une fonction dans un processus séparé, mais souhaitez que le processus actuel de bloc jusqu'à ce que la fonction retourne une valeur, utiliser Pool.apply. Comme Pool.apply, Pool.map blocs jusqu'à ce que le résultat complet est retourné.

Si vous voulez la Piscine de processus de travail pour effectuer de nombreux appels de fonction en mode asynchrone, utilisation Pool.apply_async. L' ordre des résultats n'est pas garanti d'être le même que l'ordre des appels d' Pool.apply_async.

Notez également que vous pourriez appeler un certain nombre de différentes fonctions avec Pool.apply_async (tous les appels ne doivent utiliser la même fonction).

En revanche, Pool.map s'applique de la même fonction à plusieurs arguments. Cependant, à la différence de Pool.apply_async, les résultats sont affichés dans un ordre correspondant à l'ordre des arguments.

90voto

kakhkAtion Points 81

En ce qui concerne vs :

: est exécutée uniquement dans l’un des ouvriers de la piscine. Si un des processus dans le pool se déroulera `` .

``: Cette méthode côtelettes l’itérable en plusieurs morceaux qui elle soutient dans le pool de processus comme des tâches distinctes. Si vous profitez de tous les processus dans le pool.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X