2016-11-28 67 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