【问题标题】:Use cases of parallel programming using multiprocessing module in python在 python 中使用多处理模块进行并行编程的用例
【发布时间】: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


【解决方案1】:

您不能在函数内部使用multiprocessing 定义要计算的函数的参数。 pool.map 做了什么,切掉你的 A 数组并在不同的处理器之间映射它,并且在你提交的处理器数量之间分配作业,直到它完成。但是在您的代码中,您只是将输入数组的维度作为参数提供给 pool.map,因此它只计算了一次并引发错误,而 map 需要您的函数加上一个 iterable争论。

【讨论】:

  • 对不起@Dalek 我在 sqd() 的定义中犯了一个错误。我是这样写的 def sqd(d): x = np.random.random((d, d)) return x*x.T
  • 另一方面,如果我需要给函数的只是矩阵的维度以便将此数字 (d) 传递给随机数(d),那么我到底需要什么去做?还将我需要的随机矩阵和乘积矩阵的维度传递给地图函数?非常感谢您的回答...
  • @Nacho 你想为数组的维度写一个像函数一样的变量输入,同时使用多处理吗?
  • 是的,我想...我的意思是,在这个过程中,我想到我应该并行化 random()。这不是我想做的主要任务,但我认为如果我不清楚这一点,我将永远无法解决更复杂的任务......我不确定它是否正确。
  • 例如,我不清楚为什么result=pool.apply_async(sqd, [A]) print result.get(timeout = 1) print pool.map(sqd, A) 必须一起编码,这似乎是独立的指令,我的意思是resultpool.map(sqd, A) 的关系如何?
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多