我想运行并行for循环。我需要每个进程都能访问2个大型词典gene_dict
和transcript_dict
。这是我先试过的
@everywhere( function EM ... end )
generefs = [ @spawnat i genes for i in 2:nprocs()]
dict1refs = [ @spawnat i gene_dict for i in 2:nprocs()]
dict2refs = [ @spawnat i transcript_dict for i in 2:nprocs()]
result = @parallel (vcat) for i in 1:length(genes)
EM(genes[i], gene_dict, transcript_dict)
end
但我在所有进程(不仅仅是5)上收到以下错误:
exception on 5: ERROR: genes not defined
in anonymous at no file:1514
in anonymous at multi.jl:1364
in anonymous at multi.jl:820
in run_work_thunk at multi.jl:593
in run_work_thunk at multi.jl:602
in anonymous at task.jl:6
UndefVarError(:genes)
我认为@spawnat
会将我需要的三个数据结构移动到所有进程中。我的第一个想法是,这个移动需要一段时间,并行for循环尝试在数据传输完成之前运行。
答案 0 :(得分:7)
数据由@spawnat
移动,但不绑定到与主节点上的名称同名的变量。而是将数据保存在工作人员中名为Dict
的相当隐蔽的Base.PGRP
中。要访问这些值,您必须fetch
RemoteRef
s,在您的情况下,这将是
result = @parallel (vcat) for i in 1:length(genes)
EM(fetch(genes[i]), fetch(gene_dict[i]), fetch(transcript_dict[i]))
end