我一直在使用sendto()方法在工作人员之间发送变量
我的印象是,在朱莉娅,职能是“一等公民”,但我不能使用 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时包含的脚本中定义
答案 0 :(得分:1)
无法将程序包中的方法子集发送到另一台计算机。通常,方法在同一模块中引用其他类型和函数,因此系统必须至少发送所有依赖项。这可能有用,但更大的问题是决定分发代码的责任,以及何时。例如,最初您的库可能决定将自身(或其自身的一部分)发送到其他节点,但之后用户可能希望执行库函数的并行映射,这样每个节点都需要整个库。这变得非常复杂,因此每个人都可以尽早在所有节点上加载所有需要的代码。
将有助于将代码分解为更小的模块。定义可重用函数的代码应该包含在一个模块中,该模块与实际工作中的任何内容分开,以便加载它不需要很长时间。
如果客户端节点上加载的代码确实需要与工作人员加载的代码非常不同,那么您只能将需要发送的定义放在他们自己的模块中,比如说Helpers
。您的主要代码将包含using Helpers
。然后在客户端节点上加载代码后,您可以启动工作程序并按照Chris的建议运行@everywhere include("Helpers.jl")
。然后,对Helpers
内部函数的引用应该适用于各种机器。