Я хочу перебрать некоторые асинхронные результаты с параллельной карты ipython по мере их поступления. Единственный способ, который я могу найти для этого, - перебрать объект результатов. Однако, если одна из задач вызывает исключение, итерация завершается. Есть какой-либо способ сделать это? См. Следующий код, итерация завершается, когда второе задание вызывает исключение.Исключения для обработки, ожидая следующего результата параллельной карты 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)
дает следующий результат, который останавливается перед тем заданиями 3 и 4, как сообщает
[1, 2, 3, 4]
Job 1 completed: 1
<class 'IPython.parallel.error.RemoteError'>: Job 2: RuntimeError(ERROR: 2)
Finished iteration
Есть ли способ сделать это?
Я понял, что идиома карты не является подходящим способом для этого. Мне лучше просто использовать lview.apply и обрабатывать каждый результат индивидуально. – John