Mic*_*ant 20 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
Run Code Online (Sandbox Code Playgroud)
在那里sim,adatom1并且lattice是传递给函数的对象run从而开始模拟.
但是,我最近发现我同时运行的每个批次(也就是说,每次ncpus运行nrun模拟运行的总数)都给出了完全相同的结果.
有人可以在这启发如何解决这个问题吗?
dgo*_*sen 19
只是想我会添加一个实际的答案,以便让其他人明白.
在这个问题中引用aix的答案:
会发生什么是在Unix上,每个工作进程都从父进程继承随机数生成器的相同状态.这就是他们生成相同的伪随机序列的原因.
使用random.seed()方法(或scipy/numpy等效方法)正确设置种子.另见这个numpy线程.
这是一个未解决的问题。尝试为每个进程生成唯一的种子。您可以将以下代码添加到函数的开头来解决该问题。
np.random.seed((os.getpid() * int(time.time())) % 123456789)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10652 次 |
| 最近记录: |