notes-on-7-concurrency-model-in-7-weeks

Week 1 线程和锁

优点

易于实现,适用场景广,接近“硬件本质”。

缺点

不够抽象,难以单元测试、Debug、不可重现故障。

Week 2 函数式编程

Day0 Clojure

  • 动态类型
  • 懒惰列表
  • JVM 上的 Lisp 方言
  • 没有可变状态,利于并行化
  • 不支持尾调用消除,不要依赖递归写法
  • 使用 lein run 运行项目,lein repl 进行交互式编程

Day1 词频统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(defn my-frequencies [words]
(reduce
fn [counts word] (assoc counts word (inc (get counts word 0)))
{}
words))

;; some def
(defn get [counts] key) ;; map getter
(defn assoc [counts] key value) ;; map setter
(defn get-words [text] (re-seq #"\w+" text))

;; partial for short
(map (partial * 2) [0 1 2])
(map (fn [x] (* x 2)) [0 1 2])

;; 读取器宏 #(%1 %2 ...)
#(freq (get-words %))
(fn [page] (freq (get-words page))

;; pmap, 并行化map, 仅生成部分需要结果,半懒惰(semi-lazy)
(pmap #(freq (get-words %)) pages)

;; 合并 map
(merge-with f & map)

(defn count-words-sequantial [pages]
(frequencies (mapcat get-words pages)))

Day1 并行化 & fold

1
2


优点

缺点

本文有帮助?