2016-08-11 30 views
4

我写了一个带有各种函数的Julia模块,我调用它来分析数据。这些函数中的一些函数依赖于包,这些包包含在文件“NeuroTools.jl”的开头。防止在Julia并行化中覆盖模块

module NeuroTools 

using MAT, PyPlot, PyCall; 

function getHists(channels::Array{Int8,2}... 

许多我具备的功能是并行运行有用的,所以我写了一个驱动脚本映射使用为RemoteCall功能不同的线程/取。为了加载每个线程上的函数,我使用-L选项启动Julia以在每个工作线程上加载我的模块。

julia -p 16 -L NeuroTools.jl parallelize.jl 

为了使加载功能集成到范围内,“parallelize.jl”脚本有行

@everywhere using NeuroTools 

我的并行功能的工作原理和正确执行,但每个工作线程吐出了一堆警告来自被覆盖的模块。

WARNING: replacing module MAT 
WARNING: Method definition read(Union{HDF5.HDF5Dataset, HDF5.HDF5Datatype, HDF5.HDF5Group}, Type{Bool}) in module MAT_HDF5... 
(contniues for many lines) 

有没有办法以不同的方式加载模块或更改范围以防止所有这些警告?在这个问题上文件似乎并不完全清楚。

+1

请注意,目前的Julia并行化,例如, '-p 16','@ everywhere'等是基于单独的进程,而不是单独的线程。多线程将开始在Julia 0.5中引入 –

回答

4

巧合的是今天上午我找same thing

(rd,wr) = redirect_stdout() 

所以,你会需要调用

remotecall_fetch(worker_id, redirect_stdout) 

如果您想彻底关闭,这将工作

如果你想打开它,你可以

out = STDOUT 
(a,b) = redirect_stdout() 
#then to turn it back on, do: 
redirect_stdout(out) 
0

这在较新版本中得到修复,如果您确实需要在所有工作人员的范围内使用该模块,则@everywhere using ...是正确的。 This GitHub issue谈论这个问题,并链接到其他一些相关的讨论。

如果在这种情况下仍然使用较旧版本的Julia,则在定义模块之后,而不是执行@everywhere using NeuroTools,然后在中编写using NeuroTools。 茱莉亚文档的0.5版本的Parallel Computing部说,

using DummyModule导致上的所有进程要加载的模块;然而,该模块仅在执行语句的模块中引入了范围。

执行用来告诉每个处理加载模块上的所有进程@everywhere using NeuroTools,且结果为的replacing module警告一堆。