Julia-在工人之间转移方法



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

我的印象是,在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 时包含的脚本中定义的

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

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

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

相关内容

最新更新