如何在python中对每个计算都独立的循环进行多处理



我正在尝试在我做的每个迷你项目中学习一些新东西https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life(程序。

这涉及到一个numpy数组,其中数组中的每个点("单元格"(都有一个整数值。为了发展游戏的状态,你必须为每个单元格计算其所有邻居值(8个邻居(的总和。

我的代码中的相关类如下,其中evolve()接受其中一个xxx_method方法。它适用于conv_methodloop_method,但我想在loop_method上使用多处理(我已经确定它应该可以工作,不像多线程?(来查看性能的提高。我觉得它应该起作用,因为每个计算都是独立的。我尝试过一种天真的方法,但对多处理模块的理解还不够好。我是否也可以在evolve()方法中使用它,因为我再次觉得双for循环中的每个计算都是独立的。

感谢任何帮助,包括一般代码注释。

编辑-我收到了一个RuntimeError,我有点期待,因为我对多处理的理解还不够好。需要对代码做些什么才能使其正常工作?

class GoL:
""" Game Engine """
def __init__(self, size):
self.size = size
self.grid = Grid(size) # Grid is another class ive defined
def evolve(self, neigbour_sum_func):
new_grid = np.zeros_like(self.grid.cells) # start with everything dead, only need to test for keeping/turning alive
neighbour_sum_array = neigbour_sum_func()
for i in range(self.size):
for j in range(self.size):
cell_sum = neighbour_sum_array[i,j]
if self.grid.cells[i,j]: # already alive
if cell_sum == 2 or cell_sum == 3:
new_grid[i,j] = 1
else: # test for dead coming alive
if cell_sum == 3:
new_grid[i,j] = 1
self.grid.cells = new_grid
def conv_method(self):
""" Uses 2D convolution across the entire grid to work out the neighbour sum at each cell """
kernel = np.array([
[1,1,1],
[1,0,1],
[1,1,1]],
dtype=int)
neighbour_sum_grid = correlate2d(self.grid.cells, kernel, mode='same')
return neighbour_sum_grid
def loop_method(self, partition=None):
""" Also works out neighbour sum for each cell, using a more naive loop method """
if partition is None:
cells = self.grid.cells # no multithreading, just work on entire grid
else:
cells = partition # just work on a set section of the grid
neighbour_sum_grid = np.zeros_like(cells) # copy
for i, row in enumerate(cells):
for j, cell_val in enumerate(row):
neighbours = cells[i-1:i+2, j-1:j+2]
neighbour_sum = np.sum(neighbours) - cell_val
neighbour_sum_grid[i,j] = neighbour_sum
return neighbour_sum_grid
def multi_loop_method(self):
cores = cpu_count()
procs = []
slices = []
if cores == 2: # for my VM, need to impliment generalised method for more cores
half_grid_point = int(SQUARES / 2)
slices.append(self.grid.cells[0:half_grid_point])
slices.append(self.grid.cells[half_grid_point:])
else:
Exception
for sl in slices:
proc = Process(target=self.loop_method, args=(sl,))
proc.start()
procs.append(proc)
for proc in procs:
proc.join()

我想使用多处理(我已经确定了它应该可以工作,不像多线程?(

多线程无法工作,因为它将在单个处理器上运行,这是您当前的瓶颈。多线程是针对您正在等待API回答的问题。在此期间,您可以进行其他计算。但在康威的《生命的游戏》中,你的程序一直在运行。


正确进行多处理很困难。如果您有4个处理器,您可以为每个处理器定义一个象限。但您需要在处理器之间共享结果。有了这一点,你的表现就会大受欢迎。它们需要同步/以相同的时钟速度运行/具有相同的更新节拍率,并且需要共享结果。

当你的网格很大/需要计算一吨时,多处理就开始可行了

相关内容

  • 没有找到相关文章