Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 正在使用core.async等待n个通道_Clojure_Clojurescript_Core.async - Fatal编程技术网

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/)——在最初的版本中,它不知何故出现了问题。