使用多个内核来执行Python计算?

时间:2017-03-07 15:09:56

标签: python

我在拥有24个内核的HPC上。当我运行我的Python程序时,top告诉我100% CPU,我认为这意味着它只使用一个核心!我怎么能让Python使用多个核心?

主要计算发生在优化函数调用中,我无法进入并修改。也没有for循环,因此并行循环并不是一个真正的选择。

因此,我想只使用Process,希望操作系统可以通过使用多个核心以某种方式加速执行。这是我的尝试。

from multiprocessing import Process
p = Process(target=main, args=(myArgs))
p.start()
p.join()

top仍然说100% CPU。 : - (

2 个答案:

答案 0 :(得分:0)

原始代码只启动一个进程。这就是为什么只使用一个核心的原因。要启动多个流程:

from multiprocessing import Process
n = 3
procs = []
for _ in range(n):
    procs.append(Process(target=main, args=(myArgs)))
    procs[-1].start()
for p in procs:
    p.join()

然而,这不可能改善任何事情。会发生的是main并行运行3次,执行相同操作3次。

需要编写main函数以了解它并行运行多次,以便它可以在调用之间拆分工作。这需要非平凡的过程同步技术。

答案 1 :(得分:0)

您只需分叉一个进程并加入以等待终止它。您可以在top或ps中看到两个进程,当进程在100%cpu中工作时,主进程处于空闲状态。

如果您希望所有核心都能正常工作,您应该分叉多个子流程并逐个加入,或者更简单,只需使用池。

一个例子:

from multiprocessing import Process
processes = []
for args in args_list:
    p = Process(target=main, args=(args, ))
    p.start()
    processes.append(p)
for p in processes:
    p.join()

以下是pool的简短示例:

import multiprocessing

def add(args):
    return sum(args)

pool_size = multiprocessing.cpu_count() * 2

pool = multiprocessing.Pool(processes=pool_size)

inputs = [(1, 2)] * 100

outputs = pool.map(add, inputs)
pool.close()
pool.join()