【发布时间】:2023-03-29 12:01:01
【问题描述】:
即使在 python 中我也是新手,我试图用 python 的多处理模块编写快速代码。实际上我的问题很笼统:我想知道使用多处理的不同方法,我很困惑,因为我不确定这段代码是如何工作的,以便进行正确的概括
import numpy as np
from multiprocessing import Process, Pool
def sqd(x):
return x*x.T
A = np.random.random((10000, 10000))
if __name__ == '__main__':
pool = Pool(processes = 4)
result = pool.apply_async(sqd, [A])
print result.get(timeout = 1)
print len(pool.map(sqd, A))
然而,当我为了加速随机矩阵的生成而执行以下泛化时,事情就不那么好了
import numpy as np
from multiprocessing import Pool
def sqd(d):
x = np.random.random((d, d))
return x*x.T
D=100
if __name__ == '__main__':
pool = Pool(processes = 4)
result = pool.apply_async(sqd, [D])
print result.get(timeout = 1)
print pool.map(sqd, D)
所以输出是:
$ python prueba2.py
[[ 0.50770071 0.36508745 0.02447127 ..., 0.12122494 0.72641019
0.68209404]
[ 0.19470934 0.89260293 0.58143287 ..., 0.25042778 0.05046485
0.50856362]
[ 0.67367326 0.76929582 0.4232229 ..., 0.72910757 0.56047056
0.11873254]
...,
[ 0.91234565 0.20216969 0.2961842 ..., 0.57539533 0.99836323
0.79875158]
[ 0.85407066 0.99905665 0.12948157 ..., 0.58411818 0.06688349
0.71026483]
[ 0.0599241 0.82759421 0.9532148 ..., 0.22463593 0.0859876
0.41072156]]
Traceback (most recent call last):
File "prueba2.py", line 14, in <module>
print pool.map(sqd, D)
File "/home/nacho/anaconda/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/home/nacho/anaconda/lib/python2.7/multiprocessing/pool.py", line 304, in map_async
iterable = list(iterable)
TypeError: 'int' object is not iterable
在这种情况下,我知道我向“某事”传递了不正确的参数,但我不确定这是什么原因,对于这种特定情况和其他与传递列表或范围到多处理模块,我也想知道在此之后如何释放内存,因为我允许一次执行而没有内存错误......
我想添加一些细节,不管我想知道使用多处理的不同用例,这个问题背后的动机是因为我拍了一张我的处理器刚刚工作的照片,并且有一个独立的进程在工作在单个处理器上,我认为这是由于 random() 所以我想并行化整个任务
我希望不要这么模棱两可。提前谢谢你...
【问题讨论】:
-
我的回答是否解释了您的问题或者还有什么不清楚的地方?
标签: python parallel-processing queue multiprocessing pool