4

Clojure / Jetty Web サービスに取り組んでいます。一度に 1 つのリクエストのみを処理する特別な URL があります。URLがリクエストされ、それが戻る前に再度URLがリクエストされた場合、すぐに戻りたいです。したがって、ルートを定義したより多くのcore.cljには、次のようなものがあります。

(def work-in-progress (ref false)) 

それからしばらくして

(compojure.core/GET "/myapp/internal/do-work" []
    (if @work-in-progress
        "Work in Progress please try again later"
        (do
            (dosync
                (ref-set work-in-progress true))
            (do-the-work)
            (dosync
                (ref-set rebuild-in-progress false))
            "Job completed Successfully")))

ローカルの Jetty サーバーでこれを試してみましたが、URL を 2 回ヒットして作業を 2 倍にできるようです。スレッド化されたWebサーバー環境でClojureにこれを実装するための良いパターン/方法は何ですか?

4

3 に答える 3

2

実際、これはロックの自然な使用例です。java.util.concurrent.locks.ReentrantLock特に、

同じパターンが、以前の SO の質問「Clojure で実行中/開始中/停止中のサービスのインスタンスが 1 つだけであることを確認する正規の方法?」に対する私の回答でも出てきました。; 関連するコードをここで繰り返します。

(import java.util.concurrent.locks.ReentrantLock)

(def lock (ReentrantLock.))

(defn start []
  (if (.tryLock lock)
    (try
      (do-stuff)
      (finally (.unlock lock)))
    (do-other-stuff)))

メソッドはロックの取得を試み、成功した場合tryLockは戻り、それ以外の場合はブロックしません。truefalse

于 2013-06-05T21:05:36.623 に答える
1

リソースへのアクセスもキューに入れることを検討してください。ロック/フラグと同等の機能を取得することに加えて、キューを使用すると、他の利点の中でも特にリソースの競合を観察できます。

于 2013-06-06T08:23:48.260 に答える