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

2018-05-28 11:35:09 浏览数 (3)

Week 1 线程和锁

优点

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

缺点

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

Week 2 函数式编程

Day0 Clojure

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

Day1 词频统计

代码语言:javascript复制
(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 人点赞