Je n’ai pas vu des exemples clairs avec les cas d’utilisation pour ,
et . J’utilise principalement
; Quels sont les avantages des autres ?
Réponses
Trop de publicités?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.
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.