簡體   English   中英

STM並改變clojure

[英]STM and alter in clojure

我正在編寫“Clojure編程”一書。 在解釋alter和STM時,他們說如果在更改期間,Clojure檢測到來自事務外部的ref的更改,它將使用新值重新運行事務。 如果是這種情況,我會想象你傳遞的更新函數需要是純粹的,但是文檔中沒有指出(並且它在其他類似的情況下)。

我的假設是正確的嗎? 如果沒有,STM如何重新應用該功能? 如果它是正確的,那么您是否可以依靠文檔告訴您何時可以產生副作用,何時不能?

它不一定是純粹的,它必須是冪等的 在實踐中,這基本上是一回事。

此外,它只需要在STM之外看到是冪等的:如果您產生的唯一副作用是寫入其他參考或(我認為)發送給代理,那么該操作將一直持續到您的事務成功為止。

事實並非如此,它必須是以下任何一種情況:只是,如果您的更新功能不純,結果可能不是您所期望的。

編輯: dosync的文檔告訴你,正文中的任何表達式都可能被執行多次。 如果不運行dosync ,則無法運行alter ,因此看起來您需要的所有文檔都在那里。 你想改變什么?

正如旁注:

如果您需要執行諸如登錄STM轉換之類的副作用,您可以向代理發送消息以執行非冪等部分。 僅在事務完成時才會調度發送給代理的消息,並且保證僅發送一次。

Clojure中的一點是,當你處理事務時沒有副作用,因為它們是一致的,當在更新共享值期間發現沖突時,函數將重新運行(我更喜歡重試),否則它將會成功地承諾改變。 如果必須重試,它將讀取更新的值,因此沒有副作用,您可以找到的問題是Livelock,但它有點受Clojure重試中的限制數控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM