首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Julia并行化中防止覆盖模块

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

Stack Overflow用户
提问于 2016-08-11 20:23:09
回答 2查看 175关注 0票数 6

我编写了一个具有各种函数的Julia模块,我调用这些函数来分析数据。这些函数中有几个依赖于包,这些包包含在文件“NeuroTools.jl”的开头。

代码语言:javascript
复制
module NeuroTools

using MAT, PyPlot, PyCall;

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

我所拥有的许多函数对于并行运行都很有用,因此我编写了一个驱动程序脚本来使用远程技术/fetch将函数映射到不同的线程。为了在每个线程上加载函数,我使用-L选项启动Julia,在每个工作程序上加载我的模块。

代码语言:javascript
复制
julia -p 16 -L NeuroTools.jl parallelize.jl

要将加载的函数引入作用域,"parallelize.jl“脚本有一行

代码语言:javascript
复制
@everywhere using NeuroTools

我的并行函数正常工作并正确执行,但是每个工作线程都会从被覆盖的模块中发出一系列警告。

代码语言:javascript
复制
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)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 20:49:31

巧合的是我今天早上在找同样的事情

代码语言:javascript
复制
(rd,wr) = redirect_stdout()

所以你需要打电话

代码语言:javascript
复制
remotecall_fetch(worker_id, redirect_stdout)

如果你想把它完全关掉,这是可行的。

如果你想把它打开,你可以

代码语言:javascript
复制
out = STDOUT
(a,b) = redirect_stdout()
#then to turn it back on, do:
redirect_stdout(out)
票数 4
EN

Stack Overflow用户

发布于 2018-02-03 08:17:25

这在最近的版本中得到了修正,如果您确实需要所有工作人员的作用域中的模块,那么@everywhere using ...是正确的。这个GitHub问题讨论了这个问题,并与其他相关讨论进行了链接。

如果在这种情况下仍然使用较早版本的Julia,只需在定义模块后用NeuroTools.jl编写NeuroTools.jl,而不是执行@everywhere using NeuroTools。版本0.5的朱莉娅文档的并行计算部分说,

using DummyModule使模块被加载到所有进程上;但是,只有在执行语句的过程中,模块才会进入作用域。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38905473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档