multitraitement.Piscine: utilisation s'appliquent, apply_async ou de la carte?
Je n'ai pas vu des exemples clairs avec des cas d'utilisation pour Piscine.appliquer, Piscine.apply_async et Piscine.carte. Je suis principalement à l'aide de Pool.map
; quels sont les avantages des autres?
Vous devez vous connecter pour publier un commentaire.
De retour dans les vieux jours de Python, pour appeler une fonction avec des arguments arbitraires, vous pouvez utiliser
apply
:apply
existe encore dans Python2.7 mais pas en Python3, et n'est généralement pas utilisé plus. De nos jours,est préféré. Le
multiprocessing.Pool
modules tente de fournir une interface similaire.Pool.apply
est comme Pythonapply
, 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é dansapply
, sauf que l'appel renvoie immédiatement au lieu d'attendre le résultat. UnAsyncResult
objet est retourné. Vous appelez saget()
méthode pour récupérer le résultat de l'appel de la fonction. Leget()
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 à
Pool.apply
, lePool.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é au lieu de l'appelerget()
.Par exemple:
peut donner un résultat comme celui
Avis, contrairement à
pool.map
, l'ordre des résultats peut ne pas correspondre à l'ordre dans lequel lespool.apply_async
appels ont été effectué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
. CommePool.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
. Le ordre des résultats n'est pas garanti d'être le même que l'ordre des appels àPool.apply_async
.Notez également que vous pourriez appeler un numéro de différents 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, contrairement à
Pool.apply_async
, les résultats sont affichés dans un ordre correspondant à l'ordre des arguments.if __name__=="__main__"
avantapply_async_with_callback()
sur Windows?Pool.map(func,iterable)
est équivalent àPool.map_async(func,iterable).get()
. Ainsi, la relation entrePool.map
etPool.map_async
est similaire à celle dePool.apply
etPool.apply_async
. Leasync
commandes renvoient immédiatement, tandis que la non-async
commandes de bloc. Leasync
commandes ont également une fonction de rappel.Pool.map
etPool.apply
est similaire à décider quand utilisermap
ouapply
en Python. Il vous suffit d'utiliser l'outil qui convient pour le poste. Décider entre l'utilisation de laasync
et nonasync
version dépend si vous voulez que l'appel à bloquer le processus en cours et/ou si vous souhaitez utiliser la fonction de rappel.multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)]
print [res.get(timeout=1) for res in multiple_results]
apply_async
retourne unApplyResult
objet. L'appel queApplyResult
'sget
méthode retourne la fonction associée de la valeur de retour (ou de relancermp.TimeoutError
si l'appel est terminé.) Donc, si vous mettez leApplyResult
s dans une liste ordonnée, puis l'appel de leurget
méthodes renvoie les résultats dans le même ordre. Vous pouvez simplement utiliserpool.map
dans cette situation.for
boucle au lieu de compréhension de liste pour définir les arguments de chaque processus, depuis que je suis passer plusieurs arguments à chaque processus. Certains arguments sont propres à chaque processus, certains sont constants chez tous les, et certains sont constants chez un sous-ensemble de tous les processus. À l'aide de starmap et les autres devient assez salissant pour ce cas. Aussi, je veux qu'il fonctionne dans les deux python 2 et 3.callback
danspool.apply_async
comme dans cet exemple, nous avons la garantie de la protection de l'écriture sur la variable partagéeresult_list
?pool._result_handler
thread dans le processus principal gère les valeurs retournées une à une, en passant la valeur renvoyée de la fonction de rappel. Donc vous avez la garantie que la fonction de callback sera appelée une fois pour chaque valeur retournée et il n'y a pas de simultanéité problème ici parce que la fonction de rappel est appelée de manière séquentielle par un seul thread dans le processus principal.pool.join()
avant d'inspecterresult_list
ou bien il peut ne pas contenir tous les résultats. (Après tout,pool.join()
est dire le processus principal d'attendre jusqu'à ce que toutes les tâches ont fini.)result_list
dans un processus de travail, la valeur ne sera pas vu par le processus principal.result_list
membres d'une classe. Dans les liens exemple,foo.log_result
est ce qu'on appelle un méthode liée. L'accèsfoo.log_result
retourne une fonction avec l'instancefoo
"liés", dans le sens que l'appelfoo.log_result(x)
est équivalent àFoo.log_result(foo, x)
. Notez quefoo
obtient passé comme premier argument.Concernant
apply
vsmap
:pool.apply(f, args)
:f
n'est exécuté dans l'UN des travailleurs de la piscine. Si l'UN des processus dans la piscine sera exécutéf(args)
.pool.map(f, iterable)
: Cette méthode côtelettes l'objet iterable dans un certain nombre de morceaux qu'il soumet au processus de la piscine comme des tâches distinctes. Ainsi, vous profitez de tous les processus dans la piscine.