Je souhaite parcourir certains résultats asynchrones à partir d'une carte parallèle ipython lorsqu'ils arrivent. La seule façon que je peux trouver pour faire ceci est d'itérer sur l'objet des résultats. Cependant, si l'une des tâches déclenche une exception, l'itération se termine. Est-ce qu'il y a un moyen de faire ça? Voir le code ci-dessous, l'itération se termine lorsque le deuxième travail déclenche une exception.Gestion des exceptions en attendant le prochain résultat de la carte parallèle ipython
from IPython import parallel
def throw_even(i):
if i % 2 == 0:
raise RuntimeError('ERROR: %d' % i)
return i
rc = parallel.Client()
lview = rc.load_balanced_view() # default load-balanced view
# map onto the engines.
args = range(1, 5)
print args
async_results = lview.map_async(throw_even, range(1, 5), ordered=True)
# get results
args_iter = iter(args)
results_iter = iter(async_results)
while True:
try:
arg = args_iter.next()
result = results_iter.next()
print 'Job %s completed: %d' % (arg, result)
except StopIteration:
print 'Finished iteration'
break
except Exception as e:
print '%s: Job %d: %s' % (type(e), arg, e)
donne la sortie suivante qui arrête avant que les travaux 3 et 4 sont signalés
[1, 2, 3, 4]
Job 1 completed: 1
<class 'IPython.parallel.error.RemoteError'>: Job 2: RuntimeError(ERROR: 2)
Finished iteration
Est-il possible de le faire?
Je me suis rendu compte que l'idiome de carte n'est pas un bon moyen de le faire. Je ferais mieux d'utiliser lview.apply et de gérer chaque résultat individuellement. – John