python |多处理 |分割数据

标签 python python-2.7 python-multiprocessing

我正在尝试在具有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 个进程)的“工作人员”(进程)池,然后使用 Poolmap 方法来调用这些工作人员f 每个参数一一对应(但并行)。

如果调用顺序对您来说并不重要,请查看map_async(和apply_async)。

关于 python |多处理 |分割数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43957376/

相关文章:

Python OpenSSL 生成公钥和私钥对

python - 理解 __getitem__ 方法

python - 为什么这段 Python 代码运行了两次?

python - key 错误 : 'type' while drawing a scatter plot with grouped x axis in Python

python - 按百分比获取随机 bool 值

python除法结果与负数不同

python - 如何在函数内初始化并行独立进程?

python-3.x - python multiprocessing.Queue 没有处理所有的值

python - 进程间共享锁

python - 从 Python 列表中获取数据范围