在2 CPU环境中,clojure未来的主体执行了两次

时间:2015-07-28 17:56:53

标签: concurrency clojure parallel-processing future

在具有多个CPU的环境中启动clojure未来时,我看到了一些意外的行为,我没有看到这种行为在我的单CPU(多核)dev pc上运行。

基本上代码看起来像:

(future
  (while true
    (let [work-items (get-work ...)]
      (doall
        (for [w work-items]
          (process-work w)))
      (Thread/sleep 10000))))

GET-工作的 返回尚未处理的工作项。

过程工作 进程,并保存已处理工作项的事实。

这里假设通过调用get-work返回的所有工作项将被持久化到数据库,这意味着下次调用get-work时将不会返回这些工作项。所有协调是通过DB。

当我在我的单CPU(多核)dev pc上运行时,未来的主体会按照我的预期执行一次。我曾经说过,所有可用的工作项(对于while循环的第一次迭代)都会持久化一次。

但是当在具有2个CPU(部署到我们的公司QA env)的环境中运行它时,似乎未来的主体正在被执行两次。两次我的意思是我看到所有可用的工作项都持续存在于数据库中两次。

我在未来的定义中看不到任何表明这是预期行为的东西。谁看过这个吗?这是一个令人沮丧的测试,因为我只能在部署到QA环境时看到它。

在这两种情况下,我都使用相同的运行参数运行相同的数据库。所以底层数据应该是相同的。我目前只在QA环境中的一台机器上运行,并且没有负载平衡。

我会尝试提出一个演示行为的最小例子,但在此之前,我们将非常感谢任何建议。

谢谢,

1 个答案:

答案 0 :(得分:2)

你专注于错误的事情。没有任何内核可以更改future评估其正文的次数。相反,弄清楚 else 与您正在部署的两个设置有什么不同。 QA有更多work-item s或什么?

此外,是什么让你认为你知道它执行了多少次?鉴于身体被包裹在while true中,其中的所有东西都可以运行任意次:一旦两次对我来说都会有点意外,相比之下永远,直到异常发生“。