在python中使用多处理模块进行并行编程的情况

时间:2014-08-23 07:22:06

标签: python parallel-processing queue multiprocessing pool

即使在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()所以我想并行完成任务

我希望不会那么暧昧。提前谢谢你......

1 个答案:

答案 0 :(得分:2)

您无法使用函数内的multiprocessing来定义要计算的函数的参数。 pool.map做什么,切断你的A数组并将其映射到不同的处理器之间,作业将在你提交的处理器数量到完成之间提供。但是在您的代码中,您只是将输入数组的维度作为pool.map的参数,因此它只计算了一次并引发错误,而map需要您的函数加上可迭代参数。