我希望并行运行几个模拟实例,但每个模拟都有自己独立的数据集.
目前我实现如下:
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() …Run Code Online (Sandbox Code Playgroud) 我正在学习设置 NumPy 版本 1.19 伪随机数生成器的种子以进行 Python 3.6concurrent.futures.ProcessPoolExecutor分析。在阅读了 NumPy 关于 随机采样和并行随机数生成的文档后,我编写了以下脚本来评估我的理解。
我的目标:我想确保每个并发进程使用相同的种子来启动随机进程。
我从结果中学到了什么?
(a) 使用全局种子,(b) 在将种子传递到并发进程之前预定义numpy.random.default_rng或numpy.random.SeedSequence使用种子,以及 (c) 将种子作为参数传递到并发进程中给出相同的结果并确保每个并发进程使用相同的种子开始随机过程。也就是说,不需要为每个并发进程重新创建 BitGenerator。
使用种子numpy.random.SeedSequence()对象的生成子种子不能确保每个并发进程使用相同的种子来启动随机进程。spawn()对象方法的作用SeedSequence()是确保使用 BitGenerator 结果的不同部分以避免重复?
问:我的结论正确吗?
测试脚本:
import numpy as np
from numpy.random import default_rng, SeedSequence
import concurrent.futures as cf
def random( loop ):
rg = default_rng()
return loop, [rg.random() for x in range(5)]
def random_global( loop ):
rg = default_rng(SEED)
return loop, [rg.random() for x in …Run Code Online (Sandbox Code Playgroud) 我在程序开始时设置了numpy随机种子.在程序执行期间,我使用多次运行函数multiprocessing.Process.该函数使用numpy随机函数绘制随机数.问题是Process获取当前环境的副本.因此,每个进程都独立运行,它们都以与父环境相同的随机种子开始.
所以我的问题是如何在子环境中与父进程环境共享numpy的随机状态?请注意,我想Process用于我的工作,需要使用一个单独的类,并分别import numpy在该类中执行.我尝试使用multiprocessing.Manager共享随机状态,但似乎事情没有按预期工作,我总是得到相同的结果.此外,如果我将for循环移动到内部drawNumpySamples或将其留在其中并不重要main.py; 我仍然无法得到不同的数字,随机状态总是一样的.这是我的代码的简化版本:
# randomClass.py
import numpy as np
class myClass(self):
def __init__(self, randomSt):
print ('setup the object')
np.random.set_state(randomSt)
def drawNumpySamples(self, idx)
np.random.uniform()
Run Code Online (Sandbox Code Playgroud)
并在主文件中:
# main.py
import numpy as np
from multiprocessing import Process, Manager
from randomClass import myClass
np.random.seed(1) # set random seed
mng = Manager()
randomState = mng.list(np.random.get_state())
myC = myClass(randomSt = randomState)
for i in range(10):
myC.drawNumpySamples() # this will …Run Code Online (Sandbox Code Playgroud) 在多处理调用的函数中,numpy ndarray的作用域是否有不同的作用?这是一个例子:
使用python的多处理模块我正在调用一个函数:
for core in range(cores):
#target could be f() or g()
proc = mp.Process(target=f, args=(core))
jobs.append(proc)
for job in jobs:
job.start()
for job in jobs:
job.join()
def f(core):
x = 0
x += random.randint(0,10)
print x
def g(core):
#Assume an array with 4 columns and n rows
local = np.copy(globalshared_array[:,core])
shuffled = np.random.permutation(local)
Run Code Online (Sandbox Code Playgroud)
调用时f(core),x变量是进程的本地变量,即.它按预期打印一个不同的随机整数.这些从不超过10,表明x=0在每个过程中.那是对的吗?
调用g(core)和置换数组的副本将返回4个相同的'shuffled'数组.这似乎表明工作副本不是本地子进程.那是对的吗?如果是这样,除了使用sharedmemory空间之外,当需要从共享内存空间填充时,是否可以让ndarray成为子进程的本地进程?
编辑:
改变g(core)添加随机整数似乎具有所需的效果.数组显示不同的值.必须发生的permutation事情是随机排序列(每个子进程的本地)相同的......想法?
def g(core):
#Assume an array with 4 columns and …Run Code Online (Sandbox Code Playgroud)