Change/access 远程进程中的远程变量

Change/access remote variable in remote process

我是 Julia 的新手,正在尝试完成一项非常简单的任务:

  1. 将变量 x=1 分配给每个进程
  2. 仅在进程 2 中将 x 更改为不同的值(将 x 本地更改为进程 2)
  3. 在进程 2 中打印远程 x 的新值

我的代码是:

using Distributed
function f()
  x=10*x
  println(x)
end
@everywhere x=1
remote_do(f,2)

它不打印任何东西。 另一个远程调用尝试:

r=remotecall(x->10*x,2,x)
fetch(r)
println(x)

按预期打印 10(什么匿名函数 returns)和 1(进程 1 中的 x)。 据我了解 remotecall returns a future 结果为 lambda x->10x 但不更改远程变量。事实上,它甚至不乘以远程变量,而是乘以进程 1 中的 x!

问题:如何修改和读取进程1中的远程变量?

首先,x 在本地作用域为 f(),因此即使 运行 f() 在本地进程上也会产生错误:

julia> f()
ERROR: UndefVarError: x not defined

如果你真的想在这里使用全局变量,你需要告诉 Julia:

function f()
  global x=10*x
  println(x)
end

julia> f()
10

然后,要查看为什么它不是 运行 远程,您可以尝试 remotecall_fetch 同步调用并查看任何异常(如果没有此异常,请转到 stderr远程工作者)。

julia> remotecall_fetch(f, 2)
ERROR: On worker 2:
UndefVarError: #f not defined

远程工作者没有 f 的定义。

@everywhere function f()
  global x=10*x
  println(x)
end

julia> remote_do(f,2)

julia>       From worker 2:     10

当您有更多代码时,为了使这更容易,您可以将代码放在一个模块中,然后调用 @everywhere using MyModule