Скажите, что я это сделать:Pool.map - Почему рабочий процесс не сработал раньше?
import multiprocessing as mp
def f(x):
raise OverflowError # raised BEFORE the print
print x
if __name__ == '__main__':
pool = mp.Pool(processes=1)
for _ in pool.imap_unordered(f, range(10)):
pass
pool.close()
pool.join()
Out:
Traceback (most recent call last):
File "test0.py", line 9, in <module>
for _ in pool.imap_unordered(f, range(10)):
File "/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py", line 659, in next
raise value
OverflowError
Ok выход имеет смысл. Исключение возникает перед оператором print
, поэтому выход отсутствует. Теперь почти тот же самый код, но я переключился 2 строки:
import multiprocessing as mp
def f(x):
print x
raise OverflowError # raised AFTER the print
if __name__ == '__main__':
pool = mp.Pool(processes=1)
for _ in pool.imap_unordered(f, range(10)):
pass
pool.close()
pool.join()
Out:
0
1
2
3
4
5
6
7
8
9
Traceback (most recent call last):
File "test0.py", line 9, in <module>
for _ in pool.imap_unordered(f, range(10)):
File "/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py", line 659, in next
raise value
OverflowError
Я не понимаю выход. Я ожидал либо число 0, за которым следовала трассировка стека, либо все 10 чисел и 10 трасс стека. Почему он печатает все числа и только одну трассировку стека? Почему рабочий процесс ждет самого конца, чтобы потерпеть крах?