我想运行类似的代码
(->> 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))
这段代码的解释:
- 实际上 input 中的元素及其数量在运行之前并没有定义,并且 input 中的元素可以取 0 到 10 之间的一些数字。
async/onto-chan
用于将元素的 Seq(输入片段)放入通道中c
,并将被多次调用,因此第三个参数是false
.prn
是 的替代品a-side-effect
。
我期望上面的代码打印
[0 1 2 3 4]
[5 6 7 8 9]
[10 11 12 13 14]
[15 16 17]
但是在 REPL 中它不打印任何字符。
然后我添加一个等待的时间,就像这样
(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!
在我的代码中编辑。 - 因为通道被关闭了,所以参数的每一项都
core.async/onto-chan
被core.async/>!
徒劳地放在了go-loop
in中。onto-chan
c
close!
是否有确定的方法可以在ing之前放置项目?onto-chan
写一个不使用的同步版本go-loop
?
还是我的想法错了?