我正在使用python编写一个理想的气体模拟器,现在碰撞检测是程序中最密集的部分。不过目前,我只使用了我的 8 个内核中的一个。(我使用的是 i7 3770 @ 3.4GHz)
经过最少的谷歌搜索,我找到了 python (2.7.4) 的多处理模块。我已经试过了。经过一番思考,我意识到我唯一可以真正并行运行的是在这里,我循环遍历所有粒子以检测碰撞:
for ball in self.Objects:
if not foo == ball:
foo.CollideBall(ball, self.InternalTimestep)
这里 foo 是我正在针对所有其他粒子进行测试的粒子。所以我试着这样做:
for ball in self.Objects:
if not foo == ball:
p = multiprocessing.Process(target=foo.CollideBall, args=(ball, self.InternalTimestep))
p.start()
虽然程序运行得更快了一点,但它仍然最大程度地使用了 1.5 个内核,其余的只是处于空闲状态,也没有检测到任何冲突!我已经读过,如果你一次创建太多进程(超过核心数量),那么你会得到一个积压(这是一个 196 个粒子的循环),所以这可能解释了速度比我预期的要低,但是它没有解释我仍然没有使用所有核心的事实!
反正就是太慢了!!!那么有没有一种方法可以创建 8 个进程,并且只有在运行的进程少于 8 个时才创建一个新进程?这甚至能解决我的问题吗?以及如何使用我所有的内核/为什么这段代码还没有?
我昨天才发现python中的多处理,所以恐怕必须向我说明任何答案。
感谢您的帮助!
- -编辑 - -
作为对 Carson 的回应,我尝试在 p.start 之后直接添加 p.join,这降低了程序的速度。不是每个周期花费 o.2 秒,而是每个周期花费 24 秒!