Part VI: ノンブロッキング I/O¶
概要¶
本章では、Clojure の future と promise による非同期処理を学びます。
Future¶
;; 非同期計算
(def result (future
(Thread/sleep 1000)
(+ 1 2)))
;; 結果を取得(ブロッキング)
@result ;; => 3
;; タイムアウト付き
(deref result 500 :timeout)
Promise¶
;; Promise 作成
(def p (promise))
;; 別スレッドで値を設定
(future
(Thread/sleep 100)
(deliver p :done))
;; 結果を待機
@p ;; => :done
複数の非同期タスク¶
(defn fetch-all [urls]
(let [futures (doall (map #(future (fetch-url %)) urls))]
(map deref futures)))
タイムアウト処理¶
(defn with-timeout [timeout-ms f]
(let [result (future (f))]
(deref result timeout-ms :timeout)))
;; 使用例
(with-timeout 1000 #(Thread/sleep 500)) ;; => nil
(with-timeout 100 #(Thread/sleep 500)) ;; => :timeout
future vs promise¶
| 特徴 | future | promise |
|---|---|---|
| 計算開始 | 即座に開始 | deliver まで待機 |
| 値の設定 | 内部で計算 | 外部から deliver |
| 用途 | 非同期計算 | スレッド間通信 |
次のステップ¶
Part VII では、core.async を学びます。