2

私が必要とするのは、タスクを配置し、ワーカーから1つずつ取得できる単純なキューです(タスクの順序を維持せずに)。

私はこのようなものを書きました:

;; Definition
(def q (ref []))

;; Put
(defn put-in-queue [i]
  (dosync (alter q conj i)))

;; Get
(defn get-from-queue []
  (dosync
    (let [v (peek q)]
      (alter q pop)
      v)))

正解ですか?(おそらく、このタスクにはより良い解決策もあります)

4

3 に答える 3

3

clojure.lang.PersistentQueue仕事とそのすべてに適切なツールを使用する必要があります:)。

Clojure の Hidden featuresから「借りた」以下のサンプル:

user> (-> (clojure.lang.PersistentQueue/EMPTY)
          (conj 1 2 3)
          pop)
(2 3)

詳細については、その回答の残りを参照してください。

于 2013-10-16T15:41:19.657 に答える
2

正しい解決策は、おそらくjava.util.concurrentキューを使用することjava.util.concurrent.LinkedBlockingQueueです。j.u.cキューは堅牢で、タスクに完全に適しており、Clojure で問題なく動作します。

5 つのプロデューサー、2 つのコンシューマー、および比較のために 2 つの方法で実装された制限サイズのキューのシナリオについては、資格 SO の質問を持つプロデューサー コンシューマーへの私の回答を参照してください。c.l.PersistentQueuej.u.c.LinkedBlockingQueue

于 2013-10-18T11:55:03.127 に答える
0

dsm が指摘しているように、キューが必要な場合はキューを使用し、ベクトルが本当に必要で最後に何かを追加して前から削除したい場合は、subvec両方conjともベクトルの O(1) 関数です。

user> (subvec [1 2 3] 1)
[2 3]
user> (conj [1 2 3] 4)
[1 2 3 4]
user> (-> [] (conj 1 2) (conj 3) (subvec 1))
于 2013-10-16T21:01:12.697 に答える