对每个进程使用带有不同随机种子的python多处理

时间:2012-02-09 10:24:12

标签: python multiprocessing

我希望并行运行几个模拟实例,但每个模拟都有自己独立的数据集。

目前我按如下方式实现:

P = mp.Pool(ncpus) # Generate pool of workers
for j in range(nrun): # Generate processes
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp)
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)        
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process
P.close()
P.join() # start processes  

其中simadatom1lattice是传递给启动模拟的函数run的对象。

但是,我最近发现我同时运行的每个批次(也就是说,每个ncpus用完了模拟运行的nrun总数)会得到完全相同的结果。

这里有人可以启发如何解决这个问题吗?

2 个答案:

答案 0 :(得分:18)

我想我会添加一个实际答案,以便让其他人明白。

引用aix in this question的答案:

  

在Unix上,每个工作进程都会继承相同的内容   来自父进程的随机数生成器的状态。这是   为什么他们生成相同的伪随机序列。

使用random.seed()方法(或scipy / numpy等效方法)正确设置种子。另请参阅this numpy thread

答案 1 :(得分:0)

问题的解决方案是在函数scipy.random.seed()中使用run,它为从run调用的随机函数分配新种子。

可以在multiprocessing.Pool seems to work in Windows but not in ubuntu?

中找到类似的问题(我从中获得解决方案)