朱莉娅 - 模块和并行

时间:2016-11-28 13:18:04

标签: parallel-processing julia

我无法理解如何使用工作进程和模块。我会试着简单地解释一下我的困难。

我的主要流程(流程1)上有一个模块module A

在工作进程上,我有module B,它应该处理许多复杂的计算(通常是并行工作者的情况)。

问题在于,似乎需要在工人身上定义module A ......

问题是module A远大于module B,它包含数千行代码,但module B仅使用大约15个短函数。

是否有任何解决方法,以便我可以让我的主要工作人员可以访问module A,但工作人员可以访问module B,但能够通过module A中的方法呼叫工作人员,并制作他们运行module B中定义的函数?例如,module B中可能有一个名为calculate_stuff()的方法。

我希望实现的结构如下:

module A # main worker process using this module 
    function call_worker_and_calculate()
        remotecall_fetch(calculate_stuff, 2)
    end 

    export call_worker_and_calculate
end

module B # worker process 2 is using this module  
    function calculate_stuff()
        # some stuff 
    end 

    export calculate_stuff 
end 

此特定示例将返回错误消息:

julia> A.call_worker_and_calculate()
ERROR: On worker 2:
UndefVarError: A not defined

1 个答案:

答案 0 :(得分:2)

错误消息很奇怪(我无法使用您的代码重现它,您使用的是哪个版本?)。所以我不确定这会回答你的问题。

如果您想使用其他模块B中的模块A中的名称,则import中必须usingB模块A }}

为了实现这一目标,B必须位于Julia变量LOAD_PATH中包含的路径中,或者在@everywhere 的所有工作人员上定义定义之前A,例如,

@everywhere module B  # defined on all workers
    function calculate_stuff()
        # do stuff 
    end 

    export calculate_stuff 
end

module A # only defined on the main worker process
    using B  # introduces calculate_stuff into A's scope because it is exported in B
    function call_worker_and_calculate()
        remotecall_fetch(calculate_stuff, 2)    
    end 

    export call_worker_and_calculate
end

然后A.call_worker_and_calculate()有效,A也没有在其他工作人员身上定义:

julia> remotecall_fetch(whos,2)
    From worker 2:                               B   4537 bytes  Module
    From worker 2:                            Base  34048 KB     Module
    From worker 2:                            Core  12482 KB     Module
    From worker 2:                            Main  40807 KB     Module