1

リクエストを受け取り、それらをキューに入れ、2 のバッチで処理する 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がこの種の動作をサポートしているかどうかを確認し、可能な解決策についてアドバイスできますか? ?

4

1 に答える 1

3

ラミナのポイントは、永遠にループしたくないということです。ラミナのスケジューラは、作業を行うのに十分なデータがあるときはいつでも、そのプールからスレッドを使用して作業を行う必要があります。したがって、非常に低レベルのread-channel関数を使用receiveする代わりに、コールバックを 1 回登録するか、(より頻繁に)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 に答える