防止在Julia并行化中覆盖模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止在Julia并行化中覆盖模块相关的知识,希望对你有一定的参考价值。

我写了一个带有各种函数的Julia模块,我打电话来分析数据。其中一些函数依赖于包,它们包含在文件“NeuroTools.jl”的开头。

module NeuroTools

using MAT, PyPlot, PyCall;

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

我拥有的许多函数对于并行运行很有用,所以我编写了一个驱动程序脚本,使用remotecall / fetch将函数映射到不同的线程。要在每个线程上加载函数,我使用-L选项启动Julia以在每个worker上加载我的模块。

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)

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

答案

巧合的是,我今天早上正在寻找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)
另一答案

这在最近的版本中得到修复,如果你真的需要所有工人的范围内的模块,@everywhere using ...是正确的。 This GitHub issue谈论这个问题,并与其他一些相关的讨论有关。

如果仍然使用旧版本的Julia,那么只需在定义模块后在using NeuroTools中编写NeuroTools.jl,而不是执行@everywhere using NeuroTools。版本0.5的Julia文档的Parallel Computing部分说,

using DummyModule使模块加载到所有进程上;但是,模块仅在执行语句的范围内进入范围。

执行@everywhere using NeuroTools用于告诉每个进程在所有进程上加载模块,结果是一堆replacing module警告。

以上是关于防止在Julia并行化中覆盖模块的主要内容,如果未能解决你的问题,请参考以下文章

防止 BottomSheetDialogFragment 覆盖导航栏

使用 jQuery 从表条带化中排除嵌套表

julia系列6:并行计算

防止覆盖 Javascript 函数

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

julia系列6:并行计算