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