📝Clojure Async
up: 📂Clojure Core
Clojure core.asyncについて. 非同期プログラミングをうまく行う.
https://github.com/clojure/core.async
わたしの拙い記憶だと, 非同期処理をJava やPythonでうまく処理するには,同期キューを用いたproducer-consumer patternをつかうのが鉄板だが,それをcore.asyncをつかうことによってかんたんに実装できる(素晴らしい).
一応過去記事をみると,共有メモリ方式ではなく,決定性データフローモデル??(忘れた).
- refs
Clojure: atom/delay/future/promiseの比較 #
いずれも同じ関数deref/@(reader macro)で読み出せるところがややこしい.
- atom: メモリ共有
- スレッド内のメモリ共有の仕組みあり状態を扱う.
- delay: 遅延評価
- force or deref or @ をつかって評価してはじめて計算がはじまる.
- future: バックグラウンド実行
- 評価はバックグラウンド(i.e.別スレッド)で始まるが, その結果は参照してはじめてわかる (or まだ計算が終わってないかもということもわかる).
- promise: バックグラウンド実行 + 遅延評価.
- promiseはfutureに似ている. どちらもバックグラウンド実行に対する参照を返す.
- futureは宣言時にプロシージャも宣言して即時実行.
- promiseは宣言時は参照に過ぎずdeleverで処理をあとからbindingする.
- promiseは値, futureは関数値のようなイメージ.
- どちらもバックグラウンド実行のためderefで結果を参照できる.
- promiseはfutureに似ている. どちらもバックグラウンド実行に対する参照を返す.
- refs
Refenreces #
Active Recalls #
clojure.coreの delayとfuture違いはなんですか? #
delayは遅延評価, futureは別スレッドでのバックグラウンド評価.
Clojure core.asyncのチャネルの宣言のためのメソッドはなんですか? #
async/chan
ex. (def tea-channel (async/chan 10))
Clojure core.asyncのchannelに同期的に値を取り出すときのシンタックスはなんですか? #
/>!!
Clojure core.asyncのchannelに非同期にput(or get)するときの ! の数は? #
1つ.
Clojure core.asyncにおいて値がチャネルに入ってくるのをボーリングするためのブロックの記法はなんですか? #
async/go-loop と recur
ex.
(def tea-channel (async/chan 10)) (async/go-loop [] (println “hi from " (async/<! tea-channel)) (recur))