【发布时间】:2016-05-06 13:39:38
【问题描述】:
我想运行类似的代码
(->> 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并将被多次调用,因此第三个参数是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!ed。 -
core.async/onto-chan参数的每一项都被放在onto-chan中的go-loop中(core.async/>!)徒劳无功,因为通道c已关闭。
有没有办法将项目放在close!ing 之前?
写一个同步版本的onto-chan 不使用go-loop?
还是我的想法错了?
【问题讨论】:
-
你能解释一下你的目标是什么吗?为什么要创建 chan
c,将一个传感器与它关联,但从不从中获取任何值? -
clojure.github.io/core.async/#clojure.core.async/onto-chan on-chan 函数返回一个你可以等待然后关闭c的频道。
-
@gits - 我的目标太复杂,无法在这里解释。我刚刚写了我的生产代码的简洁版本。当然,如果只是打印数字,还有很多方法。正如您所说,chan
c不是标记任何值,而是使用prn本身的值。 -
@megakorre - 谢谢。问题似乎解决了。
标签: asynchronous clojure core.async transducer