我正在尝试在具有4个节点的HPC集群中实现用python实现多处理,其中每个节点有8个处理器。我有一个用户定义的函数(我们称之为“func”),我想为 64 个不同的参数实现它。
我刚刚开始熟悉 python 的多处理操作。我知道如何使用多线程,但如果我在这里这样做,那么我将只能使用单个节点(8 个处理器)。我将非常感谢任何帮助。这是我现阶段的代码草图。
import numpy as np
import user_func as uf
Data = [D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, ... , D64 ]
Results = [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, ... , R64 ]
for i in range( len(Data) ):
Results[i] = uf.func( Data[i] )
Final_R = sum(Results)
在我的代码的完整版本中,参数(data、D1、D2 ...、D64)是从文件导入的。另外,在我的完整代码中,我将结果列表中的所有值初始化为零。
从我的代码草图版本中可以看出,我必须最终合并所有结果(我使用了一个简单的函数 sum 在这个例子中;它在我的原始代码中是一个更复杂的函数。)因此,我怀疑我可能还需要使用跨不同节点的处理器之间共享内存。
如果我能就如何实现此功能(3 个节点、8 个处理器和 64 个参数)获得任何帮助,我将不胜感激。
最佳答案
直接取自 Python 2 的文档,您可以从 Python 多处理包及其 map
方法中进行Pool
。
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))
在这里,您可以将 f
替换为您的自定义函数,并将 [1, 2, 3]
替换为您的数据(您可能需要使用 zip
code> 然后解压它们以传递多个参数或使用 apply
而不是 map
。有关更多信息,请阅读
documentation )。
上面例子的解释:
- 首先,我们从
multiprocessing
模块导入
其Pool
类。该类可以保存并运行许多进程(对程序员来说是不可见的)。 - 然后我们创建函数
f
,稍后我们将在数据中使用该函数(您可以将此函数替换为您想要的任何函数)。 - 现在我们创建一个大小为 5(5 个进程)的“工作人员”(进程)池,然后使用
Pool
的map
方法来调用这些工作人员f
每个参数一一对应(但并行)。
如果调用顺序对您来说并不重要,请查看map_async
(和apply_async
)。
关于 python |多处理 |分割数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43957376/