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上面的版本,它们会正确通过。在我的测试中,我使用 (provided .... ) 来确保进行正确的调用,并且我希望使用它来检查对 my-function 的调用。是否有可能做到这一点?我发现很难找到有关 pcall 的大量信息。

谢谢

- - - - - 编辑 - - - - -

我设计了一个演示失败的示例。

实现可以在这里找到,测试在这里。我发现单个测试运行良好,但多个测试会导致以下情况:

FAIL at (pcalls_unit.clj:29) 这些调用的次数不正确:(my-func 2 2) [预计至少一次,实际上从未调用过]

FAIL "Test some pcalls 3" at (pcalls_unit.clj:26) 预期:nil 实际:java.util.concurrent.ExecutionException:java.lang.Error:您似乎已经为 pcalls-test.pcalls/my- 创建了先决条件func 会干扰该函数在 Midje 自己的代码中的使用。要解决此问题,请定义一个您自己的使用 my-func 的函数,然后在提供的子句中描述该函数。

4

1 回答 1

1

只回答问题的第一部分pmap也可以这样写:

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