Julia-工人之间的转移方法

Julia-工人之间的转移方法,julia,worker,Julia,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

我一直在使用该方法在工作人员之间发送变量

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

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


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

我建议将此作为一个自我回答的问题。(即,从问题中删除答案并将其放在答案中)我不想发送匿名方法,我想发送函数,如果您提供更多有关用例的详细信息(您的julia版本也会很好)
remote_call
是将函数发送给工作者,然后调用它的更常见的方法。从0.5开始,它只发送一次。在v0.4中,最好的方法是在函数定义中使用
@everywhere
,或者使用
@spawnat
。对于您的包,您可能希望有一个
setup\u parallel()
函数,该函数在一个文件上调用
include
,该文件仅定义了
@everywhere
适当的方法(你可能需要
@eval@everywhere
才能在全球范围内使用它)谢谢你。事实上,当我在几周前发现这个问题时,我确实把它分解了