0

私はClojureにかなり慣れていないので、関数へのいくつかの呼び出しを並列化しようとしています.

次のようなマップがあるとします。

{:a 1 :b 2 :c 3}

キーと値を my-function という関数の引数として使用し、キーと値のペアごとに呼び出される関数を使用したいと考えています。doseq以下のように使用できます。

(doseq [entry my-map] (my-function (key entry) (val entry)))

次に、my-function の呼び出しを並列にすることにしました (実際の状況では、my-function は互いに独立した残りの呼び出しを行うため、それらを並列で実行したいと考えています)。私は次のことを思いつきました:

(apply pcalls (map #(partial my-function (key %) (val %)) my-map))

これは期待どおりに動作するようです (私が間違っている場合、またはより良い方法がある場合は修正してください)。私が今抱えている問題は、Midje テストに合格することです。doseq上記のバージョンを使用すると、正しく通過します。私のテストでは、正しい呼び出しが行われることを確認するために (提供された .... ) を使用しています。これを使用して、my-function の呼び出しを確認したいと考えています。これを行うことは可能ですか?pcalls に関する多くの情報を見つけるのは難しいと感じています。

ありがとう

- - - - - 編集 - - - - -

失敗を示す例を考案しました。

実装はここにあり、テストはここにあります。単一のテストは正常に実行されることがわかりましたが、複数のテストでは次のことが発生します。

(pcalls_unit.clj:29) で FAIL これらの呼び出しは適切な回数行われませんでした: (my-func 2 2) [少なくとも 1 回は期待されていましたが、実際には呼び出されませんでした]

FAIL "Test some pcalls 3" at (pcalls_unit.clj:26) Expected: nil 実際: java.util.concurrent.ExecutionException: java.lang.Error: pcalls-test.pcalls/my- の前提条件を作成したようですMidje 自身のコードでのその関数の使用を妨げる func。修正するには、my-func を使用する独自の関数を定義し、提供された句にその関数を記述します。

4

1 に答える 1

1

質問の最初の部分だけに答えるには、次のpmapように書くこともできます。

(doall (pmap my-function (keys my-map) (vals my-map)))
于 2013-03-14T18:28:24.200 に答える