【发布时间】:2012-10-03 14:23:38
【问题描述】:
我一直在尝试使用 python 多处理包来加速我正在做的一些物理模拟,利用我的计算机的多个内核。
我注意到,当我运行模拟时,最多使用 12 个内核中的 3 个。事实上,当我开始模拟时,它最初使用了 3 个内核,然后过了一会儿就使用了 1 个内核。有时从一开始就只使用一两个内核。我一直无法弄清楚为什么(我基本上什么都没做,除了关闭几个终端窗口(没有任何活动进程))。 (操作系统为 Red Hat Enterprise Linux 6.0,Python 版本为 2.6.5。)
我通过改变将工作拆分成的块数(2 到 120 之间)(即创建的进程数)进行了实验,但这似乎没有效果。
我在网上查找了有关此问题的信息并阅读了此站点上的大多数相关问题(例如one、two),但找不到解决方案。
(编辑:我刚刚尝试在 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回答here。)
编辑 2:最终问题自行解决,而我并不理解。我没有更改代码,也不知道更改了与操作系统相关的任何内容。尽管如此,当我运行代码时,现在所有内核都被使用了。也许这个问题稍后会再次出现,但现在我选择不进一步调查,因为它有效。感谢大家的帮助。
【问题讨论】:
-
我会尝试先加入该过程,然后再计算总和。你的解决方案对我来说看起来很奇怪。如果它没有帮助,请提供更多调试输出,以便我们可以看到您的进程在哪里被阻塞。您是否检查过启动了多少个进程?如果只使用 3 个核心,则您只能拥有 3 个或更多进程,但会处于休眠状态。这是一个有助于了解的差异。
-
@tehwalrus GIL 仅在处理同一进程的线程时才相关。出于这个原因,多处理避免使用线程。
-
问题可能出在操作系统上。
multiprocessing模块仅保证您将使用多个进程。由操作系统在可用内核 AFAIK 之间分配这些进程。 -
@J.F. Sebastian:我在 RHEL 5 或 6 上的 Python 2.6 中的
multiprocessing.Queue中没有发现任何重大错误。我在多个项目中都使用过它。 @Tropcho:当然你不应该在 Python 2.x 中使用range- 而是使用xrange。使用多个进程时,使用ps或top来检查它们的典型运行状态。 -
大家好,请原谅我没有早点提供更新:最终问题自行解决了,但我不明白如何解决。我没有更改代码,也不知道更改了与操作系统相关的任何内容。尽管如此,当我运行代码时,现在所有内核都被使用了。也许这个问题稍后会再次出现,但现在我选择不进一步调查,因为它有效。感谢大家的帮助。
标签: python multiprocessing multicore python-2.6 rhel