感谢this question,我成功地将一个代码并行化:1| def function(name, params):
2| results = fits.open(name)
3|
4| return results
5|
6| def function_wrapper(args):
7| return function(*args)
8|
9| params = [...,...,..., etc]
10|
11| p = multiprocessing..Pool(processes=(max([2, mproc.cpu_count() // 10])))
12| args_generator = ((name, params) for name in names)
13|
14| dictionary = dict(zip(names, p.map(function_wrapper, args_generator)))
如果我正确地理解了pool是如何工作的,那么在11行中指定的进程数应该是在给定时间内生成的最大进程数。所以这应该会限制我的CPU使用,对吧?我的意思是,按照我的理解,在第11行中设置的,进程/CPU的最大数量应该是[2, number_of_cpus / 10]的最大值。在
尽管如此,当我运行我的代码时,我发现在我启动后不久,所有的CPU都是100%。我错过什么了吗?在
注意:对于上下文,我需要将我的CPU使用限制在最大核数,因为我将使用共享服务器。在
更新:添加我的代码的裁剪版本。我没有打开一个fits文件,而是创建了一个与我的光谱类似的噪声高斯曲线(尽管它表现得更好…)。在
削减开支有助于解决问题。在函数fnBootstrapInstance中,拟合是在一个二维数组(基本上是一个梯形谱)上执行的,我使用for loop迭代该数组。出于某种原因,删除循环,解决问题,只使用了我指定的核心数量。我的猜测是由于某种原因for循环产生了一系列的子进程(这就是它在htop上出现的方式)。一次迭代一阶ecehelles谱就解决了这个问题。在
^{pr2}$
谢谢大家!在