Concurrency Nim:具有突变状态的并行循环

Concurrency Nim:具有突变状态的并行循环,concurrency,pass-by-reference,nim-lang,Concurrency,Pass By Reference,Nim Lang,我不熟悉这门语言。我想通过实现一个简单的遗传算法来学习它,通过将工作分配到CPU核心来进化字符串(整数数组atm): 我已经成功地并行化了“代理”的创建,但无法调用必须改变传入状态的函数“life”: ... type Agent* = ref object data*: seq[int] fitness*: float ... var pool: seq[Agent] = newAgentsParallel(POPULATION_SIZE) # Run generatio

我不熟悉这门语言。我想通过实现一个简单的遗传算法来学习它,通过将工作分配到CPU核心来进化字符串(整数数组atm):

我已经成功地并行化了“代理”的创建,但无法调用必须改变传入状态的函数“life”:

...

type
Agent* = ref object
    data*: seq[int]
    fitness*: float

...
var pool: seq[Agent] = newAgentsParallel(POPULATION_SIZE)
# Run generations
for gen in 0..<N_GENERATIONS:
    let wheel = createWheel(pool)
    let partitions: seq[seq[Agent]] = partition(pool, N_THREADS)
    parallel:
        for part in partitions:
            echo "spawning"
            spawn life(part, pool, wheel)
    pool = createPool(pool, wheel)
...
proc life(part: seq[Agent], pool: seq[Agent], wheel: seq[float]) =
for a in part:
    if random(1.0) < CROSSOVER_PROP:
        a.crossover(pool, wheel)
    if random(1.0) < MUTATE_PROP:
        a.mutate()
    a.calcFitness()
echo "life done"
。。。
类型
代理*=ref对象
数据*:seq[int]
健身*:浮球
...
变量池:seq[Agent]=newagentspallel(总体大小)
#世代相传

对于0中的gen..Update:通过检查生成的C或CPP代码,我可以看到life函数的包装,它复制了参数“pool”、“wheel”和“part”。这是我不想要的。代码片段:N_NIMCALL(void,lifeWrapper3iD9bvP7DZjU3JFcD7cH26g_2)(void*thread,void*args){…genericSeqDeepCopy(&colontmp)),((tyObject_Env_nim_geneticdotnim_9;keiv9cjznnodvqd0yrpbpa)(args))。第0部分,(&nti827srmgabitaei6xt9cyzxa);