1

我正在尝试编写一个接受请求的 Web 服务,将它们放入队列中,然后分 2 批处理它们。响应可以立即发送,我正在尝试按如下方式使用 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 是否支持这种行为并就可能的解决方案提供建议?

4

1 回答 1

3

lamina 的重点是您不想永远循环:只要您有足够的数据可以处理,您希望 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"})
于 2013-06-10T19:10:21.010 回答