[英]Python multiprocessing doesn't use all cores on RHEL6
我一直在尝试使用python多处理程序包来利用我的计算机的多个内核来加快我正在做的一些物理模拟。
我注意到,当我运行仿真时,最多使用了12个内核中的3个。 实际上,当我开始仿真时,它最初使用3个内核,然后过一会儿就使用1个内核。 有时从一开始就只使用一个或两个内核。 我一直无法弄清楚为什么(除了关闭一些终端窗口(没有任何活动进程)之外,我基本上什么都没改变)。 (操作系统为Red Hat Enterprise Linux 6.0,Python版本为2.6.5。)
我通过改变将工作拆分成的块的数量(2到120之间)(即创建的进程数量)进行了实验,但这似乎没有效果。
我在网上寻找有关此问题的信息,并通读了该站点上的大多数相关问题(例如, 一个 , 两个 ),但找不到解决方案。
(编辑:我只是尝试在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的答案。)
编辑2:最终问题在我不了解的情况下得以解决。 我没有更改代码,也没有更改任何与操作系统相关的信息。 尽管如此,现在在运行代码时,所有内核都已使用。 也许问题会在以后再次出现,但是目前我选择不再进行进一步研究,因为它仍然有效。 感谢大家的帮助。
我在i7
处理器上使用Python版本2.7.3 x64
在Ubuntu 12.04 x64 (kernel 3.2.0-32-generic)
上运行了您的示例,系统报告的所有8个内核都完全过载(基于htop
观察),所以您的问题是,先生,是基于OS的实现,并且代码不错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.