2016-11-28 7 views
3

私は、モジュールと一緒にワーカープロセスを使用する方法を理解するトラブルを抱えています。私は難しさを簡単に説明しようとします。ジュリア - モジュールと並列

私は私のメインプロセス(工程1)モジュール、module Aに持っています。 (多くの場合、パラレル労働者の場合のように)ワーカープロセスで

、私は数多くの複雑な計算を処理することになっているmodule Bを、持っています。

問題が唯一の用途、それは何千行ものコードが含まれ、

問題はmodule Amodule Bよりもはるかに大きいということです... module Aが労働者に定義する必要があるかのように、それが思われることですが、module B約15の短い機能。

私は私のメインの作業員を作るmodule Aへのアクセスを持っていますが、労働者がmodule Bへのアクセスが、module Aにメソッドから労働者を呼び出すことができる、と彼らのmodule Bで定義された関数を実行することができますので、いずれかの回避策はありますか?例えば、calculate_stuff()と呼ばmodule B方法があるかもしれません。

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) ''のような呼IST。いずれの場合においても、 'B'は、パスに存在するか、または '@のeverywhere'を使用して、各ワーカーに定義されています。 – tim

答えて

2

エラーメッセージが奇数である(私はそれを再現することはできません。この特定の例では、エラーメッセージを返す

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 

私は達成するために期待していた構造のようなものがありますあなたのコードでは、どのバージョンを使用していますか?)。だから私はあなたの質問に答えているのか分からない。 A

あなたが別のモジュールAにモジュールBから名前を使用したい場合は

、あなたが必要 importまたは usingモジュール B。これが機能するために

Bは、例えばA@everywhere前に定義して、すべての労働者にジュリアにLOAD_PATH変数含まれる、または定義されたパスに

その後
@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%確信していませんでしたが、Idはモジュール 'B'を' A'のスコープに正しく持ってこなかったと思います。 'Aの中の部分。 3000のモジュールを7つのコアにロードして、メインモジュールに15の無駄なメソッドを追加して保存しました。 – isebarn