使用pmap
函数时,如果未在任何辅助进程中定义该函数,则会发生错误。但是,当函数调用其他函数或在另一个.jl
文件中使用其他函数时,在每个相关函数上使用@everywhere
宏当然不是一个好的解决方案。
是否有一种有效的方法可以将功能及其助手有效地发送给所有可用的工人?
答案 0 :(得分:3)
我认为没有一个宏可以与函数定义一起使用,以将其所有辅助函数的定义发送给所有辅助进程。
但是,有比发送@everywhere
更好的方法来发送所需的所有功能。
您可以将所有这些功能放在文件中,并使用include
@everywhere include("mynewfile.jl")
到处放置。如果您的函数在另一个.jl
文件中使用其他函数,请将该include
语句也用于另一个文件,放在mynewfile.jl
中。如果要使用另一个文件中的模块,请将using
或import
语句放在mynewfile.jl
以类似的方式,您可以使用@everywhere begin...end
块代替文件。将所有这些功能,using
或import
语句,include
等放入begin...end
块中,并将@everywhere
放在begin
之前。如果您使用的是IJulia笔记本,这将特别有用。
julia> @everywhere begin
g(x) = x^2
f(x) = g(x)*2
end
julia> pmap(f, 1:5)
5-element Array{Int64,1}:
2
8
18
32
50
您还可以创建模块/包,而仅使用一个@eveywhere using MyNewModule
。如果您在包装之外使用模块,则还应该在所有位置都包含该模块的定义/文件。
您可能会发现阅读the relevant manual entry.
非常有用