📝Clojure Async

📝Clojure Async

up: 📂Clojure Core

Clojure core.asyncについて. 非同期プログラミングをうまく行う.

https://github.com/clojure/core.async

わたしの拙い記憶だと, 非同期処理をJava やPythonでうまく処理するには,同期キューを用いたproducer-consumer patternをつかうのが鉄板だが,それをcore.asyncをつかうことによってかんたんに実装できる(素晴らしい).

一応過去記事をみると,共有メモリ方式ではなく,決定性データフローモデル??(忘れた).

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で結果を参照できる.

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))