Julia - 在工人之间转移方法
Julia - Transferring methods between workers
我一直在使用 sendto() 方法在 worker 之间发送变量
我的印象是,在 Julia 中,函数是 'first class citizens',但我无法使用 sendto() 方法
在 worker 之间传递函数
在 worker 之间传输预定义方法的推荐方法是什么?
更新
我好像可以用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 时包含的脚本中定义
无法将包中方法的子集发送到另一台机器。很多时候,方法会引用同一模块中的其他类型和函数,因此系统也必须至少发送所有依赖项。这可能行得通,但更大的问题是决定由谁负责分发代码,以及何时分发。例如,最初您的库可能决定将自身(或自身的一部分)发送到其他节点,但随后用户可能希望对您的库函数进行并行映射,以便每个节点都需要整个库。这变得非常复杂,所以对于每个人来说,尽早在所有节点上加载所有需要的代码要简单得多。
这将有助于将您的代码分解成更小的模块。定义可重用函数的代码应该包装在一个模块中,与任何执行 "real work" 的东西分开,这样加载它就不会花费大量时间。
如果加载到客户端节点上的代码确实需要与加载到工作节点上的代码有很大不同,您可以只将需要发送的定义放在它们自己的模块中,比如 Helpers
。您的主要代码将包含 using Helpers
。然后在您的代码加载到客户端节点上之后,您可以按照 Chris 的建议启动工作人员和 运行 @everywhere include("Helpers.jl")
。然后对 Helpers
中的函数的引用应该可以跨机器工作。
我一直在使用 sendto() 方法在 worker 之间发送变量
我的印象是,在 Julia 中,函数是 'first class citizens',但我无法使用 sendto() 方法
在 worker 之间传递函数在 worker 之间传输预定义方法的推荐方法是什么?
更新
我好像可以用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 时包含的脚本中定义
无法将包中方法的子集发送到另一台机器。很多时候,方法会引用同一模块中的其他类型和函数,因此系统也必须至少发送所有依赖项。这可能行得通,但更大的问题是决定由谁负责分发代码,以及何时分发。例如,最初您的库可能决定将自身(或自身的一部分)发送到其他节点,但随后用户可能希望对您的库函数进行并行映射,以便每个节点都需要整个库。这变得非常复杂,所以对于每个人来说,尽早在所有节点上加载所有需要的代码要简单得多。
这将有助于将您的代码分解成更小的模块。定义可重用函数的代码应该包装在一个模块中,与任何执行 "real work" 的东西分开,这样加载它就不会花费大量时间。
如果加载到客户端节点上的代码确实需要与加载到工作节点上的代码有很大不同,您可以只将需要发送的定义放在它们自己的模块中,比如 Helpers
。您的主要代码将包含 using Helpers
。然后在您的代码加载到客户端节点上之后,您可以按照 Chris 的建议启动工作人员和 运行 @everywhere include("Helpers.jl")
。然后对 Helpers
中的函数的引用应该可以跨机器工作。