Clojure 正在使用core.async等待n个通道
以同样的方式Clojure 正在使用core.async等待n个通道,clojure,clojurescript,core.async,Clojure,Clojurescript,Core.async,以同样的方式alt等待其中一个n个通道获得值,我正在寻找惯用的方法等待所有n个通道获得值 我之所以需要它,是因为我“生成”了n个go块来处理异步任务,并且我想知道它们何时全部完成。我相信有一个非常漂亮的方法可以实现这一点。你可以说(mapv#(async/) 如果您想在单个值到达时处理它们,然后在最终通道生成值后执行一些特殊操作,您可以利用alts!/alts!!获取通道向量,它们是函数,而不是宏,因此您可以轻松地传递动态构造的向量 因此,您可以使用alts!!等待您最初收集的n个频道,然后在剩
alt代码>等待其中一个n个通道获得值,我正在寻找惯用的方法等待所有n个通道获得值
我之所以需要它,是因为我“生成”了n个go块来处理异步任务,并且我想知道它们何时全部完成。我相信有一个非常漂亮的方法可以实现这一点。你可以说(mapv#(async/)
如果您想在单个值到达时处理它们,然后在最终通道生成值后执行一些特殊操作,您可以利用alts!
/alts!!
获取通道向量,它们是函数,而不是宏,因此您可以轻松地传递动态构造的向量
因此,您可以使用alts!!
等待您最初收集的n个频道,然后在剩余的频道上再次使用它,等等
(def c1 (async/chan))
(def c2 (async/chan))
(def out
(async/thread
(loop [cs [c1 c2] vs []]
(let [[v p] (async/alts!! cs)
cs (filterv #(not= p %) cs)
vs (conj vs v)]
(if (seq cs)
(recur cs vs)
vs)))))
(async/>!! c1 :foo)
(async/>!! c2 :bar)
(async/<!! out)
;= [:foo :bar]
(def c1(异步/信道))
(def c2(异步/信道))
(def out)
(异步/线程)
(循环[cs[c1 c2]vs[]]
(让[[vp](异步/alts!!cs)
cs(过滤(非p%)cs)
vs(conj vs v)]
(如有)(见下文)
(重复cs vs)
vs()()))
(异步/>!!c1:foo)
(异步/>c2:bar)
(异步/
相反,如果您希望从所有输入通道获取所有值,然后在它们全部关闭时执行其他操作,则需要使用async/merge
:
clojure.core.async/merge
([chs][chs buf-or-n])
获取源通道的集合并返回一个
包含从中获取的所有值。返回的通道将为
默认情况下为无缓冲,或者可以提供buf-or-n。通道
将在所有源通道关闭后关闭
使用core.async
map
功能:
(<!! (a/map vector [ch1 ch2 ch3]))
;; [val-from-ch-1 val-from-ch2 val-from-ch3]
(谢谢!我想merge
正是我所需要的。太好了!注意。我刚刚添加了一个最简单的解决方案,用于等待每个通道的一个值(与所有通道关闭前的所有值相反),这就是(mapv#(async/)——在最初的版本中,它不知何故出现了问题。