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
增值
溢流器
我的问题是:

  • 对于
    map
    :为什么从0跳到3、6和9
  • 对于
    imap\u unordered
    :为什么这次一直到9?有什么不同

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