Python 多进程循环碰撞检测

Python 多进程循环碰撞检测,python,multiprocessing,collision-detection,Python,Multiprocessing,Collision Detection,我正在使用python编写一个理想的气体模拟器,现在碰撞检测是程序中最密集的部分。但目前,我只使用8个内核中的一个。(我使用的是i7 3770@3.4GHz) 通过谷歌搜索,我找到了python的多处理模块(2.7.4)。我试过了。经过一点思考,我意识到我唯一能真正并行运行的地方是这里,在这里我循环通过所有粒子来检测碰撞: for ball in self.Objects: if not foo == ball: foo.CollideBall(ba

我正在使用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,这就减慢了程序的速度。而不是每周期0.2秒,而是每周期24秒

据我所知,您将一个粒子与所有其他粒子进行测试,然后依次对每个粒子执行该操作。基于此,我想说您的问题是,您试图优化代码以在所有内核上工作,而不尝试优化代码本身

相反,您可以分割粒子,以便只检查彼此靠近的粒子。一种可能的方法是四叉树:参见

在第二步中,您可以并行化所有内容。对于四叉树,您可以手动解析最上层,并为每个子树创建一个新过程。这样,进程彼此独立,不会阻塞。我希望通过四叉树实现二次加速(想想当前运行时间的平方根),并通过并行化实现进一步的线性加速(除以进程数)


很抱歉,我无法用Python来解释它。

据我所知,您将一个粒子与所有其他粒子进行测试,然后依次对每个粒子执行该操作。基于此,我想说您的问题是,您试图优化代码以在所有内核上工作,而不尝试优化代码本身

相反,您可以分割粒子,以便只检查彼此靠近的粒子。一种可能的方法是四叉树:参见

在第二步中,您可以并行化所有内容。对于四叉树,您可以手动解析最上层,并为每个子树创建一个新过程。这样,进程彼此独立,不会阻塞。我希望通过四叉树实现二次加速(想想当前运行时间的平方根),并通过并行化实现进一步的线性加速(除以进程数)


很抱歉,我无法用Python来解释它。

据我所知,您将一个粒子与所有其他粒子进行测试,然后依次对每个粒子执行该操作。基于此,我想说您的问题是,您试图优化代码以在所有内核上工作,而不尝试优化代码本身

相反,您可以分割粒子,以便只检查彼此靠近的粒子。一种可能的方法是四叉树:参见

在第二步中,您可以并行化所有内容。对于四叉树,您可以手动解析最上层,并为每个子树创建一个新过程。这样,进程彼此独立,不会阻塞。我希望通过四叉树实现二次加速(想想当前运行时间的平方根),并通过并行化实现进一步的线性加速(除以进程数)


很抱歉,我无法用Python来解释它。

据我所知,您将一个粒子与所有其他粒子进行测试,然后依次对每个粒子执行该操作。基于此,我想说您的问题是,您试图优化代码以在所有内核上工作,而不尝试优化代码本身

相反,您可以分割粒子,以便只检查彼此靠近的粒子。一种可能的方法是四叉树:参见

在第二步中,您可以并行化所有内容。对于四叉树,您可以手动解析最上层,并为每个子树创建一个新过程。这样,进程彼此独立,不会阻塞。我希望通过四叉树实现二次加速(想想当前运行时间的平方根),并通过并行化实现进一步的线性加速(除以进程数)


很抱歉,我不能用Python来解释它。

通过一个有效的四叉树,您可以设置一个线程池(作为一个类)并定义分配给各个线程的作业(另一个类)(如果可能,还可以从线程框架中定义另一个类)。在您的情况下,作业包含必须检查的四叉树节点列表。最初,每个顶级四叉树节点(2D中的4个/3D中的8个)驻留在自己的作业中

因此,最多可以有4个(分别为8个)线程,每个线程检查四叉树的一个独立子树。如果需要更多线程来充分利用计算机的处理能力,如果线程遇到许多深子树,可以让线程将部分作业放回线程池

对于t