Lamina Batched Queue

时间:2013-06-10 15:22:20

标签: clojure channel lamina

我正在尝试编写一个接收请求的Web服务,将它们放入队列,然后分批处理它们。响应可以立即发送,我正在尝试使用Lamina如下(虽然不确定这是正确的选择)...

(def ch (channel))

(def loop-forever
  (comp doall repeatedly))

(defn consumer []
  (loop-forever
    (fn []
      (process-batch
        @(read-channel ch)
        @(read-channel ch)))))

(def handler [req]
  (enqueue ch req)
  {:status 200
   :body "ok"})

但是这不起作用...... :(我已经浏览了所有Lamina文档,但无法理解如何使用这些渠道。任何人都可以确认Lamina是否支持这种行为并建议一种可能的解决方案?

1 个答案:

答案 0 :(得分:3)

薄层的一点是你不想永远循环:你希望lamina的调度程序使用其池中的线程,只要你有足够的数据就可以为你工作。因此,不是使用非常非常低级别的read-channel函数,而是使用receive注册一次回调,或者(更常见的)receive-all注册回调,以便每次收到一个频道数据。例如:

(def ch (lamina/channel))

(lamina/receive-all (lamina/partition* 2 channel)
                    (partial apply process-batch))

(defn handler [req]
  (lamina/enqueue ch req)
  {:status 200
   :body "ok"})