Python多处理不使用RHEL6上的所有核心

时间:2012-10-03 14:23:39

标签: python multiprocessing multicore python-2.6 rhel

我一直在尝试使用python多处理程序包来加速我正在利用计算机的多个内核进行的一些物理模拟。

我注意到,当我运行我的模拟时,最多使用12个核心中的3个。事实上,当我开始模拟时,它最初使用3个核心,然后一段时间后它变为1核心。有时从一开始就只使用一个或两个核心。我无法弄清楚为什么(我基本上没有改变任何东西,除了关闭几个终端窗口(没有任何活动进程))。 (操作系统是Red Hat Enterprise Linux 6.0,Python版本是2.6.5。)

我通过改变工作被分割的块数(2到120之间)进行实验(即创建的进程数),但这似乎没有效果。

我在线查找了有关此问题的信息并阅读了此网站上的大多数相关问题(例如onetwo),但无法找到解决方案。

(编辑:我刚尝试在Windows 7下运行代码并且它正在使用所有可用的内核。但我仍然希望为RHEL修复此问题。)

这是我的代码(物理遗漏):

from multiprocessing import Queue, Process, current_process

def f(q,start,end): #a dummy function to be passed as target to Process
    q.put(mc_sim(start,end))

def mc_sim(start,end): #this is where the 'physics' is 
    p=current_process()
    print "starting", p.name, p.pid        
    sum_=0
    for i in xrange(start,end):
        sum_+=i
    print "exiting", p.name, p.pid
    return sum_

def main():
    NP=0 #number of processes
    total_steps=10**8
    chunk=total_steps/10
    start=0
    queue=Queue()
    subprocesses=[]
    while start<total_steps:
        p=Process(target=f,args=(queue,start,start+chunk))
        NP+=1
        print 'delegated %s:%s to subprocess %s' % (start, start+chunk, NP)
        p.start()
        start+=chunk
        subprocesses.append(p)
    total=0
    for i in xrange(NP):
        total+=queue.get()
    print "total is", total
    #two lines for consistency check:    
    # alt_total=mc_sim(0,total_steps)
    # print "alternative total is", alt_total
    while subprocesses:
        subprocesses.pop().join()

if __name__=='__main__':
    main()

(事实上,代码基于Alex Martelli's answer here。)

编辑2:最终问题解决了,我没有理解如何。我没有更改代码,也没有意识到更改了与操作系统相关的任何内容。尽管如此,现在运行代码时会使用所有内核。也许问题会在以后重新出现,但是现在我选择不进一步调查,因为它有效。感谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

我在Ubuntu 12.04 x64 (kernel 3.2.0-32-generic)上使用2.7.3 x64处理器上的Python版本i7运行了您的示例,并且系统报告的所有8个核心都完全超载(基于htop观察),所以主席先生,您的问题基于操作系统实施,代码很好。