Python 当工作进程引发异常时,pool.map和pool.imap_之间的差异无序
假设我这样做:Python 当工作进程引发异常时,pool.map和pool.imap_之间的差异无序,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,假设我这样做: import multiprocessing as mp def f(x): print x raise OverflowError if __name__ == '__main__': pool = mp.Pool(processes=1) pool.map(f, range(10)) pool.close() pool.join() 输出: 输出: 0 1. 2. 3. 4. 5. 回溯(最近一次呼叫最后一次): 文件“
import multiprocessing as mp
def f(x):
print x
raise OverflowError
if __name__ == '__main__':
pool = mp.Pool(processes=1)
pool.map(f, range(10))
pool.close()
pool.join()
输出:
输出:
0
1.
2.
3.
4.
5.
回溯(最近一次呼叫最后一次):
文件“test0.py”,第9行,在
6.
7.
对于池中的u.imap_无序(f,范围(10)):
8.
文件“/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py”,下一页第659行
9
增值
溢流器
我的问题是:
- 对于
:为什么从0跳到3、6和9map
- 对于
:为什么这次一直到9?有什么不同imap\u unordered
map
,imap
,以及imap\u无序处理数据块。就其性质而言,他们准备将这些块并行地提交给多个进程
对于imap_unordered:为什么这次一直到9点?什么
不同
对于imap
(大概是imap\u无序的
)。因此,f
实际上将开始对所有值执行
您可以通过传递chunksize
参数来检查此行为。如果将chunksize=1
提供给map
,您将获得与其他示例类似的行为
地图:为什么从0跳到3、6和9
虽然文档中没有提到它,但似乎map
的默认chunksize
更智能。在这里,看起来块大小是3,因此块将是[[0,1,2],[3,4,5],[6,7,8],[9]
我不确定当您只有一个进程时,为什么还会发生所有这些情况,但我猜实现会在检查结果之前聚集所有结果。异常IIRC在子进程中被捕获并通过IPC序列化-它们是任何其他异常的结果。chunksize算法map
使用的是:chunksize,extra=divmod(len(),*4));如果额外:chunksize+=1
。在这种情况下:divmod(10,1*4)==(2,2)
,因此给出了3的chunksize
。
0
3
6
9
Traceback (most recent call last):
File "test1.py", line 9, in <module>
pool.map(f, range(10))
File "/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
OverflowError
import multiprocessing as mp
def f(x):
print x
raise OverflowError
if __name__ == '__main__':
pool = mp.Pool(processes=1)
for _ in pool.imap_unordered(f, range(10)):
pass
pool.close()
pool.join()
0
1
2
3
4
5
Traceback (most recent call last):
File "test0.py", line 9, in <module>
6
7
for _ in pool.imap_unordered(f, range(10)):
8
File "/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py", line 659, in next
9
raise value
OverflowError