防止在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 覆盖导航栏