前に入れ-INGのを-ing私は非同期入力と出力( - 副作用)を分割し!上にちゃん
(->> input
(partition-all 5)
(map a-side-effect)
dorun)
のようなコードを実行したいと思います。
次に、以下で実験するコードを記述しました。このコードの
;; using boot-clj
(set-env! :dependencies '[[org.clojure/core.async "0.2.374"]])
(require '[clojure.core.async :as async :refer [<! <!! >! >!!]])
(let [input (range 18)
c (async/chan 1 (comp (partition-all 5)
(map prn)))]
(async/onto-chan c input false)
(async/close! c))
説明:
- 実際に入力の要素およびその数量を実行する前に定義されておらず、入力の要素0から10
- にいくつかの数字によって取られることができます
async/onto-chan
は、要素のSeq(入力の断片)をチャネルc
に配置するために使用され、何度も呼び出され、3番目の引数はfalse
です。 prn
は、a-side-effect
の代替品です。
私は版画REPLで
[0 1 2 3 4]
[5 6 7 8 9]
[10 11 12 13 14]
[15 16 17]
上記のコードは、しかし、それは何の文字を印刷しないと予想。
そして私は、このコードは、上記の私の期待される出力を与えたこの
(let [c (async/chan 1 (comp (partition-all 5)
(map prn)))]
(async/onto-chan c (range 18) false)
(Thread/sleep 1000) ;wait
(async/close! c))
のように、待機する時間を追加します。
そして、私はcore.async/onto-chan
を調べます。
そして、私が起こった何だと思う:
- をチャネル
c
は私のコードでcore.async/close!
編でした。 - の各項目はが閉じていたので
go-loop
のonto-chan
に無駄に(core.async/>!
)を入れました。
close!
の前にアイテムを入れる方法はありますか? go-loop
を使用していないonto-chan
の同期バージョンを作成しますか?
私の考えは間違っていますか? megakorreのアイデアを取って
あなたの目標は何ですか?あなたはなぜchan 'c'をつくってトランスデューサをそれに関連付けるのですか? – glts
https://clojure.github.io/core.async/#clojure.core.async/onto-chan オンチャーン機能は、待機してから閉じることができるチャンネルを返します。 – megakorre
@gits - 私の目標はここで説明するには複雑すぎる。私はちょうど私の生産コードの合意バージョンを書いた。もちろん、数字を印刷するだけの方法はたくさんあります。ちょうどあなたが言ったように、 'c'はトークンではなく、' prn'で値を消費します。 – ryo