2017-10-18 16 views
2

Si je comprends bien, apply_async renvoie immédiatement avec un objet AsyncResult. Si je collectionne ces objets de la façon suivante, et que j'utilise get() seulement après que tous les ouvriers ont fini, est-il sûr de supposer que les valeurs seront dans l'ordre dans lequel la fonction a été appelée?apply_async ordre des résultats

objRes = [None] * len(aRange) 
pool = Pool(processes=8) 
for x in aRange: 
    objRes[x] = pool.apply_async(f,(arg1, arg2, arg3,)) 
pool.close() 
pool.join() 

res = [None] * len(aRange) 
for x in aRange: 
    res[x] = objRes[x].get() 

J'ai commencé à essayer d'utiliser pool.map() et pool.starmap() au lieu, mais j'ai deux tableaux dans le cadre des arguments et ne pouvait pas comprendre exactement comment les passer.

Répondre

1

L'objet AsyncResult renvoyé par la fonction apply_async est associé aux paramètres de la fonction tuple que vous avez planifiés.

Par conséquent, lorsque vous appelez AsyncResult.get, vous obtiendrez les résultats de ce travail donné.

Si vous placez les objets AsyncResult dans une liste avec le même ordre que vous avez planifié les travaux, vous obtiendrez les résultats dans cet ordre.

La fonction map fonctionne en interne de manière très similaire à celle de votre exemple. Si vous voulez passer plus d'un paramètre à la fonction planifiée, vous devez le grouper avec le reste des arguments. Il peut être très consommateur de mémoire si vous avez beaucoup d'arguments.

arg_list = ((arg1, arg2, arg3) for _ in aRange) 

pool.map(f, arg_list)