我想并行运行一个函数,其中函数是通过字符串参数提供的。它首先从字符串解析为表达式,然后并行运行。
问题是所有工作进程都不知道字符串参数。
我怎样才能做到这一点:
module test
function run(f)
@everywhere f_exp = eval(parse(f))
values = SharedArray(Float64,2)
@sync @parallel for i = 1:2
values[i] = f_exp(i)
end
return mean(values)
end
end
# RUN AS FOLLOWS
# @everywhere include("c:\\projects\\evaluator\\test.jl")
# test.run("function func(x) return 2*x end")
我也试过@everywhere f_exp = eval(parse("@everywhere $f"))
,虽然我没想到它会起作用......但事实并非如此。
如何让每个过程知道参数?
将@everywhere f
作为函数运行的第一行也没有做任何事情。
答案 0 :(得分:1)
如果我的代码周围没有module...end
,我可以使用它,如下所示:
function run(f)
@eval @everywhere f = $f
@everywhere f_exp = eval(parse(f))
values = SharedArray(Float64,2)
@sync @parallel for i = 1:2
values[i] = f_exp(i)
end
return mean(values)
end
如果我用module...end
包围此函数,我会收到类似于以下错误的错误:## 9#11未定义(在工作程序2上)
我知道它不能与module...end
一起使用的原因是@everywhere
使用模块Main ...我尝试了这个方向,但没有让它工作