Вот демоверсия pool
, которая работает:
In [11]: def foo(i):
...: return np.arange(i), np.arange(10-i)
...:
In [12]: with multiprocessing.Pool(processes=2) as pool:
...: x = pool.map(foo, range(10))
...:
In [13]: x
Out[13]:
[(array([], dtype=int64), array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),
(array([0]), array([0, 1, 2, 3, 4, 5, 6, 7, 8])),
(array([0, 1]), array([0, 1, 2, 3, 4, 5, 6, 7])),
(array([0, 1, 2]), array([0, 1, 2, 3, 4, 5, 6])),
(array([0, 1, 2, 3]), array([0, 1, 2, 3, 4, 5])),
(array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])),
(array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3])),
(array([0, 1, 2, 3, 4, 5, 6]), array([0, 1, 2])),
(array([0, 1, 2, 3, 4, 5, 6, 7]), array([0, 1])),
(array([0, 1, 2, 3, 4, 5, 6, 7, 8]), array([0]))]
pool.map
выполняет итерацию, а не какой-то внешний for
цикл.
И чтобы немного приблизиться к вашему примеру:
In [14]: def foo(alist):
...: return np.arange(*alist), np.zeros(alist,int)
...:
...:
In [15]: alists=[(0,3),(1,4),(1,6,2)]
In [16]: with multiprocessing.Pool(processes=2) as pool:
...: x = pool.map(foo, alists)
...:
In [17]: x
Out[17]:
[(array([0, 1, 2]), array([], shape=(0, 3), dtype=int64)),
(array([1, 2, 3]), array([[0, 0, 0, 0]])),
(array([1, 3, 5]), array([[[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]]]))]
Обратите внимание, что pool.map
возвращает список со всеми случаями, сгенерированными из alists
. Не имеет смысла распаковывать это x
.
x,y = pool.map(...) # too many values to pack error
Я могу распаковать x
, используя идиому zip*
:
In [21]: list(zip(*x))
Out[21]:
[(array([0, 1, 2]), array([1, 2, 3]), array([1, 3, 5])),
(array([], shape=(0, 3), dtype=int64), array([[0, 0, 0, 0]]), array([[[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]]]))]
Это список из 2 кортежей; в действительности список версий транспонирования. Это может быть распаковано:
In [23]: y,z = zip(*x)
In [24]: y
Out[24]: (array([0, 1, 2]), array([1, 2, 3]), array([1, 3, 5]))
In [25]: z
Out[25]:
(array([], shape=(0, 3), dtype=int64), array([[0, 0, 0, 0]]), array([[[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]]]))