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正确批处理消息?_Clojure_Clojurescript_Core.async - Fatal编程技术网

Clojure 如何使用core.async正确批处理消息?

Clojure 如何使用core.async正确批处理消息?,clojure,clojurescript,core.async,Clojure,Clojurescript,Core.async,我希望通过计数和超时(即10毫秒或10条消息,以先到者为准)在core.async chan上批处理消息。Tim Baldridge,但它在core.async中使用了不推荐使用的函数,并且不使用传感器。我在找下面这样的东西 (defn batch [in out max-time max-count] ... ) 传感器实际上不应该是批处理功能的关注点–作为输入通道的接受者,它将看到该通道上任何传感器转换的值,而任何收听输出的接受者将依次看到该通道传感器转换的值 对于一个实现,下面的函

我希望通过计数超时(即10毫秒或10条消息,以先到者为准)在core.async chan上批处理消息。Tim Baldridge,但它在core.async中使用了不推荐使用的函数,并且不使用传感器。我在找下面这样的东西

(defn batch [in out max-time max-count]
  ...
 )

传感器实际上不应该是批处理功能的关注点–作为
输入
通道的接受者,它将看到该通道上任何传感器转换的值,而任何收听
输出
的接受者将依次看到该通道传感器转换的值

对于一个实现,下面的函数将从
in
中获取批
最大计数
项目,或自上一批输出以来,以
最大时间
到达的数量,并将其输出到
out
,在输入通道关闭时关闭,取决于输入通道的传感器(如有,任何收听<代码>输出的接收者也将如上所述应用该通道的传感器):


伟大的代码,简单而正确。用于批处理Redis PubSub消息(使用
out
作为发布者)。回答很棒。我想知道
clojure.core.async/take
是否适合此操作,但无论如何都需要添加循环(以及“永不阻塞”超时!)因此,在一天结束时,上面的实现看起来仍然坚如磐石。在这个代码中,当输入通道如答案所述关闭时,chan的输出在哪里被关闭?@OlimSaidov,这就是
(nil?v)
的情况
(defn batch [in out max-time max-count]
  (let [lim-1 (dec max-count)]
    (async/go-loop [buf [] t (async/timeout max-time)]
      (let [[v p] (async/alts! [in t])]
        (cond
          (= p t)
          (do
            (async/>! out buf)
            (recur [] (async/timeout max-time)))

          (nil? v)
          (if (seq buf)
            (async/>! out buf))

          (== (count buf) lim-1)
          (do
            (async/>! out (conj buf v))
            (recur [] (async/timeout max-time)))

          :else
          (recur (conj buf v) t))))))