Clojureを勉強している4
状態とコンカレンシーの話。
- atom出てきた。
reset!で再セットかswap!- 別のスレッドで使ってる場合はリトライされるのか。
- 例では
futureで別スレッドを用意 - printlnみたいな副作用を含む関数などを差し挟むと当然同じ出力が発生する
- しかし、atomは想定通りに更新される。かくして
swap!は副作用がないってわけか。
- 次はrefs。
- ClojureはSTM付いてるのか。えらい
alterもリトライするatom/swap!とref/alterがそれぞれ対応してるのかcommuteはリトライしないとな。DBとか扱うときはこれになるんかなref-set便利だな。
次はagents。非同期。
agent/sendがまた対応してると。send-offはI/O-blockingの可能性があるときに使用するのか- 失敗した時
restart-agentでリセットすることもできる set-error-mode!とset-error-handler!であらかじめ失敗した時の処理を定めておいても良いと。
Atom は 同期 で Uncoordinated
- Ref は 同期 で Coordinated
Agent は 非同期 で Uncoordinated
Chapter 3 State and Concurrency
- Handling Real-World State and Concurrency