首先,我知道有大约20个类似标题的问题,我保证我已经阅读了所有这些问题。
我知道Python多处理的大多数缺点,而且我并不期望大量加速应用它。这是我第一次使用multiprocessing.Process
,过去我总是使用Pool
。我认为我做错了,因为它运行速度要慢几个数量级。顺序方法的一次迭代在不到一秒的时间内运行,而并行方法的一次迭代运行时间超过一分钟。
对于上下文,这是一个n体模拟器,这种特殊的方法是检查碰撞并更新作用在每个物体上的力。我知道有更好的方法可以做到这一点,这只是为了我的学习。
以下是代码:
from multiprocessing import Process, Manager
def par_run_helper(self, part, destroy, add):
for other in self.parts:
if other not in destroy and other is not part:
if part.touches(other):
add.append(part + other)
destroy.append(other)
destroy.append(part)
self.touches += 1
print("TOUCH " + str(part.size + other.size))
else:
part.interact(other, self.g)
def par_run(self, numTicks=1, visualizeEvery=1, visualizeAfter=0):
manager = Manager()
destroy = manager.list()
add = manager.list()
for tick in range(numTicks):
print(tick)
processes = []
for part in self.parts:
print(part)
p = Process(target=self.par_run_helper, args=(part, destroy, add))
p.start()
processes.append(p)
for p in processes:
p.join()
for p in destroy:
try:
self.parts.remove(p)
except Exception:
pass
for p in add:
self.parts.append(p)
每次迭代都需要大约相同的时间,因为它们都在相同数量的元素上运行。
经理是multiprocessing.Manager()
。
part
是粒子的缩写,是我目前正在更新的粒子。
destroy
和add
是将在刻度结束时销毁并添加的粒子列表。
我测试的只有300个零件,但我希望能够做到1000个。