2015-09-28 25 views
3

目標: 重新加載整個模塊並在任務中使用其導出的函數和類型而不重新啓動它們的可能性。重新加載模塊/文件和任務問題

問題: 我在運行使用這些函數的任務時應用新的函數定義時出現問題。這個想法是重新加載一個模塊,而不是再次包含一個文件,但是在後面我會展示簡化的問題版本。

一個簡單的例子: 讓我解釋一下使用一個文件中定義只有一個功能f問題,具體如下:

#sample_file.jl 
f() = info("f version 01") 

運行f從任務每10秒:

julia> include("sample_file.jl") 

julia> function call_f() 
    while (true) 
     f() 
     sleep(10) 
    end 
end 

julia> task = @async call_f() 

然後在REPL每隔10秒我們看到:

julia> INFO: f version v01 
INFO: f version 01 
INFO: f version 01 
INFO: f version 01 

現在嘗試更改sample_file.jl中的定義,例如,

#sample_file.jl 
f() = info("f version 02") 

在REPL:

julia> reload("sample_file") 
julia> f() 
INFO: f version 02 

...但是從任務的相關信息仍然給:

julia> INFO: f version 01 
INFO: f version 01 
INFO: f version 01 
INFO: f version 01 
INFO: f version 01 
... 

問:

你有什麼想法處理呢?

回答

0

你的問題的核心,你描述它是share data並行計算,這始終是一個原因座位下來思考有關可用的選項,限制等

可以只需調用@everywhere它會在所有進程上運行一個命令,但我會說這是一個糟糕的主意,因爲您可能會遇到另一個數據共享/同步問題。

我最好的選擇,考慮到簡短的描述,將使用「得到全局狀態更新」的方式:

# main process 
# ... 
# 
    if should_update 
    current_state.updateSomeParameter(newValue) 
    end 
# state is always `spawn`ed 
@spawn current_state 
# continue doing main process stuff 

# on remote process 
while do_stuff 
    # do stuff 
    fetch(current_state) 
    updateSelfTo(current_state) 
    #continue doing my remote stuff 
end 
+0

感謝您的關注和時間。這個問題與協程(單個線程中的多任務)有關,而與不同的線程/進程有關。 –

+0

即便如此,您還是需要在不同的進程/線程/執行程序之間共享全局狀態,這從來不那麼簡單。在你的特定情況下,你可以通過'spawn'ing和'fetch'使協程/任務/線程知道你的.jl文件中的變化。再次,更改.jl文件可能不是共享數據/狀態的最佳方式 –

+0

是的,我通過共享狀態對象來完成此操作。至於你的提議,我不太確定一個共享對象是否應該包含所有已經改變的功能和類型。起初,我想知道爲什麼這個任務對任何重新加載都沒有反應(既沒有從外部也沒有在它的範圍內)。任何想法? –

2

在您簡單的例子,這是https://github.com/JuliaLang/julia/issues/265。函數call_f被編譯爲f的原始定義,並且當f被更改時當前不會被重新編譯。

一般來說,我認爲你需要考慮當f被改變時你想要發生什麼。你想call_f重新編譯?不需要重新編譯call_f的簡單解決方案是將當前函數f存儲在非常量變量中(當您定義函數時,f變爲常量)。然後jit編譯器會知道該函數可以改變,並會產生一個間接調用。

+0

對變量的賦值適用於簡化示例。現在,我將嘗試在模塊版本中使用它。 –

+0

不幸的是,同樣的方法對模塊不起作用。 #=模塊文件=# 模塊sample2_module 出口˚F F()=信息( 「F版本V001」) 端 #=主代碼=# 使用sample2_module 函數call_f() \t VF = sample2_module。 f #vf = f也不起作用! \t而(真) \t \t VF() \t \t睡眠(10) \t年底 結束 任務= @Async call_f() #=代碼結束=# 你有與模塊的任何執政經驗和你指出的問題? –