我正在尝试编写一个接收请求的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是否支持这种行为并建议一种可能的解决方案?
答案 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"})