我对 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 的函数,然后在提供的子句中描述该函数。