2016-11-28 63 views
3

我无法理解如何使用工作进程和模块。我会尽量简单地解释我的困难。Julia - 模块和并行性

我对我的主要过程(过程1)有一个模块,module A

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

的问题是,它好像需要对工人定义module A ...

的问题是,module Amodule 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 
+0

您可以将'A'中的函数改为接受函数ex ecute作为参数,例如'call_worker_and_calculate(f)= remotecall_fetch(f,2)',并且调用类似于'A.call_worker_and_calculate(B.calculate_stuff)'。无论如何,'B'必须在路径中或者使用'@ everywhere'定义在每个工人身上。 – tim

回答

2

错误消息是奇数(我不能复制与您的代码,你使用什么版本?)。所以我不确定这会回答你的问题。

如果你想在另一个模块A使用的名字从一个模块B,你必须importusing模块BA

对于这项工作,B必须是包含在朱莉娅变量LOAD_PATH或定义上所有工人的A@everywhere之前定义,例如道路,

@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 
+0

非常感谢你!我昨天放弃了,并扔掉了我的测试代码,所以我不是100%确定我错了什么地方,但是我猜我没有把模块'B'正确地带入'A'的范围,也就是说我没有使用B 'A'里面的部分。您只需要将一个3000线模块加载到7个内核上,并在主模块中添加15个无用的方法 – isebarn