我想知道如何从Python中的多处理函数中提取输出。我是多处理的新手,并且对它如何工作的理解有限(不是因为缺乏尝试)。
我需要使用31个不同的输入为InfForecast和InitialStorage运行优化(目前......可能有多达10,000个输入并且正在执行独立优化)。我希望我可以使用多处理来加快速度,一次处理多个独立优化。我想要的是输出(每个优化的5个值)被放入数组“Nextday”,它应该具有(5,31)的维度。似乎输出Nextday因为我已经编写的代码是空的或无法访问。如何提取/访问值并将它们放入Nextday?
注意:函数main(...)是一个非常复杂的优化问题。我希望问题很容易理解而不提供它。当我在它上面循环并为范围内的每个i(31)调用它时,它可以工作。
from multiprocessing.pool import ThreadPool as Pool
Nextday=np.zeros((5,31))
pool_size = 4 # Should I set this to the number of cores my machine has?
pool = Pool(pool_size)
def optimizer(InfForecast, InitialStorage):
O=main(InfForecast,InitialStorage)
return [O[0][0], O[0][1], O[0][2], O[0][3], O[0][4]]
for i in range(31):
pool.apply_async(optimizer, (InfForecast[i],InitialStorage[i]))
pool.close()
Nextday=pool.join()
除此之外,我不确定这是否是最好的做事方式。如果它正在工作(我不确定它),它肯定似乎很慢。我读到,做多处理与线程可能会更好,这似乎是线程化?如果我错了,请原谅我。
我也很好奇如何选择pool_size,就像我在代码中的注释中看到的那样。我可能最终在云服务器上运行它,所以我希望我想要使用的pool_size与我在自己的机器上使用的数量略有不同。它只是核心数量吗?
任何建议都将不胜感激。
答案 0 :(得分:1)
你应该使用
from multiprocessing.pool import Pool
如果你想进行多重处理。
如果你有自己的机器,游泳池大小应该以{{1}}开始,并手动调整以获得最佳效果。如果你的进程是cpu绑定的,那么留下一个可用的核心将使你的机器更具响应性 - 如果你的代码不是cpu绑定的,你可以拥有比核心更多的进程(调整这个很挑剔,但你只需要尝试)。
在进行多处理(或任何其他时间)时,您不应该在文件的最顶层有任何代码。将所有内容放入函数中并从以下位置调用start函数:
multiprocessing.cpu_count()
(题外话:使用大写字母哦作为变量名称非常糟糕,并且你得到的语句在某些字体中几乎是不可读的,如O [0] [0])。
在常规python中,if __name__ == "__main__":
my_start_function()
函数由此等式“定义”:
map
因此Pool方法(imap / imap_unordered / map / map_async)具有类似的语义,在您的情况下,您可以将它们称为:
map(fn, lst) == [fn(item) for item in lst]
由于map-functions采用了函数和列表,我使用def my_start_function():
...
results = pool.map(optimizer, zip(InfForecast, InitialStorage))
函数创建了一个列表,其中每个项目的每个参数都有一个元素(它的作用类似于拉链)。