下面是我现在的代码。它似乎运行得很好。然而,我并不完全理解它。我认为如果没有
另一方面,如果我选择使用
.join()
,我会冒着代码在池完成执行之前进入下一个 for 循环的风险。难道我们不需要那三行被注释掉的代码吗?另一方面,如果我选择使用
.close()
和 .join()
的方式,有没有办法重新打开那个已关闭的池,而不是每次都使用 Pool(6)
?import multiprocessing as mp
import random as rdm
from statistics import stdev, mean
import time
def mesh_subset(population, n_chosen=5):
chosen = rdm.choices(population, k=n_chosen)
return mean(chosen)
if __name__ == '__main__':
population = [x for x in range(20)]
N_iteration = 10
start_time = time.time()
pool = mp.Pool(6)
for i in range(N_iteration):
print([round(x,2) for x in population])
print(stdev(population))
# pool = mp.Pool(6)
population = pool.map(mesh_subset, [population]*len(population))
# pool.close()
# pool.join()
print('run time:', time.time() - start_time)
pool.wait_async
,但仍然不希望代码在所有进程完成运行之前超过某一行,那么我需要执行pool.close
和pool.join
,在这种情况下,我需要在每个循环中重新构建池,即pool = mp.Pool(6)
吗? - Indominuspopulation
最终会包含N_iteration * len(population)
个值?在我的代码(和意图)中,每次迭代后人口的大小不会改变。每次迭代的操作是:随机抽取几个(默认为5个,请参见我的编辑),并取平均值形成新人口的一个成员,重复此过程,直到新人口的大小与当前人口相同。 - Indominusresult.append
而不是population.append
--以避免使用population.append
会导致的竞争条件。mesh_subset
可能会收到更改后的population
。 - unutbupool.apply_async
不会阻塞,调用population = result
可能会将population
分配给部分或空列表。 - unutbu