Clojure で学ぶ並行処理¶
概要¶
本シリーズでは、Clojure の並行処理機能を使用して「Grokking Concurrency」の概念を実装します。
Clojure は JVM 上で動作する関数型言語で、不変データ構造と強力な並行処理プリミティブを提供します。
目次¶
| Part | タイトル | トピック |
|---|---|---|
| Part I | 逐次処理 | 基本、SHA-256 |
| Part II | スレッド | future、Thread |
| Part III | マルチタスキング | atom、イベント同期 |
| Part IV | 並列パターン | Fork/Join、Pipeline |
| Part V | 同期と排他制御 | STM、ref、dosync |
| Part VI | ノンブロッキング I/O | future、promise |
| Part VII | 非同期プログラミング | core.async |
| Part VIII | 分散並列処理 | pmap、MapReduce |
Clojure の並行処理プリミティブ¶
1. Atom(アトム)¶
;; CAS ベースの単一値更新
(def counter (atom 0))
(swap! counter inc) ; インクリメント
(reset! counter 0) ; リセット
@counter ; 値を取得
2. Ref + STM(ソフトウェアトランザクショナルメモリ)¶
;; 複数の値を同期的に更新
(def account (ref 1000))
(dosync
(alter account + 100)) ; トランザクション内で更新
3. Agent(エージェント)¶
;; 非同期の状態更新
(def logger (agent []))
(send logger conj "message") ; 非同期で更新
4. Future / Promise¶
;; 非同期計算
(def result (future (expensive-computation)))
@result ; 結果を待機
;; Promise
(def p (promise))
(deliver p :done)
@p
5. core.async¶
(require '[clojure.core.async :refer [chan go >! <!]])
(def ch (chan))
(go (>! ch "hello")) ; チャネルに送信
(go (println (<! ch))) ; チャネルから受信
環境構築¶
Leiningen プロジェクト¶
lein new app grokking-concurrency-clojure
依存関係(project.clj)¶
:dependencies [[org.clojure/clojure "1.11.1"]
[org.clojure/core.async "1.6.681"]
[buddy/buddy-core "1.11.423"]]
テスト実行¶
lein test
次のステップ¶
Part I から始めて、逐次処理の基礎を学びます。