目標: 重新加載整個模塊並在任務中使用其導出的函數和類型而不重新啓動它們的可能性。重新加載模塊/文件和任務問題
問題: 我在運行使用這些函數的任務時應用新的函數定義時出現問題。這個想法是重新加載一個模塊,而不是再次包含一個文件,但是在後面我會展示簡化的問題版本。
一個簡單的例子: 讓我解釋一下使用一個文件中定義只有一個功能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
...
問:
你有什麼想法處理呢?
感謝您的關注和時間。這個問題與協程(單個線程中的多任務)有關,而與不同的線程/進程有關。 –
即便如此,您還是需要在不同的進程/線程/執行程序之間共享全局狀態,這從來不那麼簡單。在你的特定情況下,你可以通過'spawn'ing和'fetch'使協程/任務/線程知道你的.jl文件中的變化。再次,更改.jl文件可能不是共享數據/狀態的最佳方式 –
是的,我通過共享狀態對象來完成此操作。至於你的提議,我不太確定一個共享對象是否應該包含所有已經改變的功能和類型。起初,我想知道爲什麼這個任務對任何重新加載都沒有反應(既沒有從外部也沒有在它的範圍內)。任何想法? –