我的問題可能看起來很奇怪,但我認爲我面臨volatile
對象的問題。clojure是「多線程」嗎?
我寫了這樣實現的庫(只是一個方案,而不是真正的內容):
(def var1 (volatile! nil))
(def var2 (volatile! nil))
(def do-things [a]
(vreset! var1 a)
(vswap! var2 (inc @var2))
{:a @var1 :b @var2})
所以我所計算的全局變量,其被外部值初始化的,別人和我回到自己的內容。 我用揮發性比原子更好的速度,而不是每次重新定義每個計算的新變量。
的問題是,這似乎在實踐中失敗,因爲我map
做,事情的集合(在另一個程序中)與內子調用該函數occasionaly,像(僞代碼):
(map
(fn [x]
(let [analysis (do-things x)]
(if blabla
(do-things (f x))
analysis)))) coll)
內部條件調用會在引擎蓋下產生另一個線程嗎?似乎是的,因爲有些事情叫做工作,有時候不行。 除了定義每個do-things
機體內部揮發性之外,還有其他什麼方法可以做嗎?
編輯
其實錯誤是另一回事,但問題仍然是在這裏:這是一個可以接受的/安全,沒有對多線程功能的任何顯式調用呢?
感謝您的洞察力,它似乎我在另一個代碼的地方犯了一個錯誤,但我仍然不確定什麼是valatiles(文檔有點缺乏),如果它可以安全地在函數範圍外使用它 –