【问题标题】:Julia - Transferring methods between workersJulia - 在工作人员之间转移方法
【发布时间】:2016-12-14 00:25:00
【问题描述】:

我一直在使用sendto()方法在worker之间发送变量

我的印象是,在 Julia 中,函数是“一等公民”,但我无法使用 sendto() 方法在工作人员之间传递函数

在工作人员之间传输预定义方法的推荐方式是什么?

更新

我好像可以使用 sendto() 方法发送匿名函数

a = function(x)
x*2
end

sendto(2,a=a)

remotecall_fetch(2,a,5)
4

相对

function g(x)
x*2
end

sendto(2,g=g)

remotecall_fetch(2,g,10)
ERROR: On worker 2:
function g not defined on process 2

这在某些情况下就足够了,但我需要能够发送已定义的函数,因为它们中的大多数都很复杂并且在启动 julia 时包含的脚本中定义

【问题讨论】:

  • 我建议将此作为一个自我回答的问题。 (即从问题中删除您的答案并将其放入答案中)
  • 我不想发送匿名方法,我想发送函数
  • 您能否提供更多关于您的用例的详细信息(您的 julia 版本也会很好)。 remote_call 是将函数发送给工作人员,然后调用它的更常用方法。从 0.5 开始,它只发送一次。 github.com/JuliaLang/julia/pull/16808
  • 在 v0.4 中,最好的方法是在函数定义处使用@everywhere,或者使用@spawnat
  • 对于您的包,您可能希望有一个 setup_parallel() 函数,该函数在一个文件上调用 include,该文件只是 @everywhere 定义了适当的方法(您可能需要 @eval @everywhere 来获取它在全球范围内)

标签: julia worker


【解决方案1】:

无法将包中的方法子集发送到另一台机器。方法经常引用同一模块中的其他类型和函数,因此系统至少必须发送所有依赖项。这可能行得通,但更大的问题是决定谁负责分发代码,以及何时分发。例如,最初您的库可能决定将自身(或自身的一部分)发送到其他节点,但随后用户可能想要对您的库函数进行并行映射,这样每个节点都需要整个库。这变得非常复杂,因此对于每个人来说,尽早在所有节点上加载所有需要的代码要简单得多。

这将有助于将您的代码分解为更小的模块。定义可重用函数的代码应该包装在一个模块中,与任何“实际工作”的模块分开,这样加载它就不会花费大量时间。

如果客户端节点上加载的代码确实需要与工作节点上加载的代码完全不同,您可以只将需要发送的定义放在它们自己的模块中,比如Helpers。您的主代码将包含using Helpers。然后在客户端节点上加载代码后,您可以按照 Chris 的建议启动工作程序并运行 @everywhere include("Helpers.jl")。然后对Helpers 中的函数的引用应该可以跨机器工作。

【讨论】:

  • 谢谢。实际上,当我几周前发现这一点时,我确实把东西分解了
猜你喜欢
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多