
[英]multiprocessing.Pool not running on last element of iterable
[英]How to get multiprocessing.Pool().starmap() to return iterable
我正在尝试从 function 以及 output 的输入构造一个 dataframe。之前我使用的是循环
for i in range(x):
for j in range(y):
k = func(i, j)
(Place i, j, k into dataframe)
但是范围很大,所以我尝试使用 multiprocessing.Pool() 来加快速度
with mp.Pool() as pool:
result = pool.starmap(func, ((i, j) for j in range(y) for i in range(x))
(Place result into dataframe)
但是,使用 pool 我不再可以访问 i 和 j,因为它们只是 function 的输入
我试图让 function 返回输入,但随着 for 循环数量的增加,这并没有多大意义,因此如何将 iterables 传递到 starmap 中?
您的starmap
版本和普通版本不等效。 在生成器表达式中使用多个循环时,外层循环首先出现。 所以电话应该是:
result = pool.starmap(func, ((i, j) for i in range(x) for j in range(y)))
回到这个问题,就像我在评论中提到的那样,starmap 以与提交顺序相同的顺序返回任务结果。 因此,考虑到您唯一不想并行化的是func
调用,您可以简单地for
append 所有结果放在一个列表中,根据y
的值(列数)将其分块,然后在pool 同时获取i
, j
的值和func
的返回值。 例子:
import multiprocessing as mp
def func(i, j):
return f"{i}{j}"
# https://stackoverflow.com/a/17483656/16310741
def chunks(l, n):
return [l[i:i+n] for i in range(0, len(l), n)]
if __name__ == "__main__":
x = 3
y = 4
with mp.Pool() as pool:
# ['00', '01', '02', '03', '10', '11', '12', '13', '20', '21', '22', '23']
result = pool.starmap(func, ((i, j) for i in range(x) for j in range(y)))
# [['00', '01', '02', '03'], ['10', '11', '12', '13'], ['20', '21', '22', '23']]
result = chunks(result, y)
for i in range(x):
for j in range(y):
curr_result = result[i][j]
print(i, j, curr_result)
# Do something with i, j, and curr_result
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.