我是Clojure的新手,我正在尝试将一些调用并行化为函数。
假设我的地图如下:
{:a 1 :b 2 :c 3}
我希望将键和值用作名为my-function的函数的参数,并为每个键/值对调用该函数。我可以使用doseq
,如下所示:
(doseq [entry my-map] (my-function (key entry) (val entry)))
然后我决定我希望对my-function的调用是并行的(在我的实际情况中,my-function将进行彼此独立的rest调用,所以我想并行执行它们)。我想出了以下内容:
(apply pcalls (map #(partial my-function (key %) (val %)) my-map))
这似乎按照我的预期工作(如果我错了或者有更好的方法,请纠正我)。我现在遇到的麻烦是让我的Midje测试通过。如果我使用上面的doseq
版本,它们会正确传递。在我的测试中,我使用(提供....)来确保正确的调用,并且我希望使用它来检查对my-function的调用。是否有可能做到这一点?我发现很难在pcalls上找到很多信息。
由于
---------编辑---------
我设计了一个演示故障的例子。
可以找到here和测试here的实现。我发现单个测试运行正常,但多个测试会导致以下结果:
FAIL at(pcalls_unit.clj:29)这些电话不合适 次数: (my-func 2 2)[预计至少一次,实际上从未被召唤]
FAIL“测试一些pcalls 3”(pcalls_unit.clj:26) 预期:无 实际:java.util.concurrent.ExecutionException:java.lang.Error:您好像已经创建了一个先决条件 pcalls-test.pcalls / my-func干扰了该函数的使用 Midje自己的代码。要修复,请定义您自己使用的功能 my-func,然后在提供的子句中描述该函数。
答案 0 :(得分:1)
仅回答问题的第一部分pmap
也可以用来写这个:
(doall (pmap my-function (keys my-map) (vals my-map)))